2017-07-05 6 views
3

私はバックグラウンドで実行される関数を持っており、完了したらメインスレッドのUIを更新します。コードがメインスレッドへの呼び出しに達すると、ユニットテストが失敗することに気付きました。これをどうやって修正するのですか?ユニットテストでMainThreadを実行する

func getResponse(identifier : String, completion :(success :Bool)->){ 
    // uses identifier to request data via api and on completion: 
    completion(status: true) 
} 

testObject.getResponse(wantedValue){(success) in 
    if status == true { 
     dispatch_async(dispatch_get_main_queue()){ 
      self.presentViewController(alertController, animated: true, completion: nil) 

      } 
    } 
} 

とユニットテスト

中:長い擬似プロジェクト内のロジックと ない正確なコードメインコードで

を示している:例えば NBについては

func testGetResponse(){ var testObject = TestObject() var expectation = self.self.expectationWithDescription("Response recieved") testObject.getResponse(wantedValue){(success) in expectation.fulfill() } self.waitForExpectationsWithTimeout(10) { (error) in XCTAssertTrue(testViewController.presentedViewController as? CustomViewController) } } 

これは潜在的なデッドロックのようですが、私はcertaではありませんどのようにそれを回避するかについて。

+0

「getResponse()」の宣言/実装を示してください。 – shallowThought

+0

@shallowThoughtはコードにマイナーな変更を加えました。意図した疑似ロジックを描くのは実際のプロジェクトの正確なコードではありません – DrPatience

+0

ユニットテストまたはUIテストについてお話ししていますか? – shallowThought

答えて

0

waitForExpectationsWithTimeoutは、非同期関数が呼び出されていないか、正常に終了していない(およびfulfill()メソッドを呼び出していない)場合の代替メソッドです。

エラーオブジェクトをチェックしてみます。

fullfill()呼び出しを行う前に検証を行うことをお勧めします。

Swift 3のサンプルコードで、fullfillとwaitForExpectationsWithTimeoutの使用方法を参照してください。

func testGetResponse(){ 

    var testObject = TestObject() 
    var validationExpectation = expectation(description: "Response received") 

    testObject.getResponse(wantedValue){(success) in 
     // Do your validation 
     validationExpectation.fulfill() 
     // Test succeeded 
    } 

    waitForExpectationsWithTimeout(60) { (error) in 
     if let error = error { 
      // Test failed 
      XCTFail("Error: \(error.localizedDescription)") 
     } 
    } 
} 
+0

私はすでにこれが実装されているが、入力に感謝 – DrPatience

関連する問題