2016-11-21 11 views
0

ユニットテスト非同期操作の従来の方法は何ですか?CloudKitクエリが完了するのを待つ単体テストを書く従来の方法はありますか?

背景:

私のアプリは、それがCloudKitに呼び出しを行い、結果をその内部のデータソース更新初期化される

:私が書いたX-コードのユニットテスト機能を使用

import Foundation 
import CloudKit 

class CountdownItemModel { 

    // MARK: - Properties 
    var countdownItems: [CountdownItem] = [] 
    static let sharedInstance = CountdownItemModel() 
    let container: CKContainer 
    let database: CKDatabase 

    // MARK: - Initializers 
    init() { 
     container = CKContainer.default() 
     database = container.privateCloudDatabase 
     getAllCountdownItems() 
    } 

    // MARK - CloudKit Methods 
    func getAllCountdownItems() { 
     let query = CKQuery(recordType: "CountdownItem", predicate: NSPredicate(value: true)) 
     database.perform(query, inZoneWith: nil) { 
      (results, error) in 
      if (error != nil) { 
       print("[ERROR] Error in getAllCountdownItems\n", error!) 
      } 
      else { 
       self.countdownItems.removeAll(keepingCapacity: true) 
       if let records = results { 
        for record in records { 
         let countdownItem = CountdownItem(record: record) 
         self.countdownItems.append(countdownItem) 
        } 
       } 
      } 
     } 
    } 
} 

をiCloudからのデータが到着したことを確認するためのテストですが、このテストはクエリが返される前に実行されるため失敗します。

import XCTest 
@testable import countdown 

class countdownTests: XCTestCase { 

    let model = CountdownItemModel.sharedInstance 

    override func setUp() { 
     super.setUp() 
    } 

    override func tearDown() { 
     // Put teardown code here. This method is called after the invocation of each test method in the class. 
     super.tearDown() 
    } 

    func testItemsCountGreatThanZero() { 
     sleep(10) // <- DIRTY FIX/WORKAROUND 
     XCTAssert(model.countdownItems.count > 0) 
    } 
} 

あなたが見ることができるように、私がテストに睡眠を挿入することによって、この問題を回避働いてきたが、このストライキは厄介なビットとしても、パフォーマンステストではなく、ユニットテストの領域にveers。

一般に認められているアプローチはありますか?

答えて

3

非同期テストを行うときは、期待通りに作業できます。

func testSomething() { 
    let exp = expectation(description: "anAsyncCall") 

    DoSomethingAsync() { 
     exp.fulfill() 
    } 

    waitForExpectations(timeout: 10) { error in 
     XCTAssertNil(error, "\(error)") 
    } 
} 

この場合、非同期呼び出しが10秒以内に完了すると、テストは成功します。

+0

優秀、ありがとうございます! – mazz0

関連する問題