2017-09-29 128 views
1

我有許多異步單元測試可以根據自己的期望正確工作。但是,當我在訴訟中運行所有測試時,他們不會等待其他人完成 - 異步回調在下次測試開始運行時仍處於等待狀態。我想要的是每次測試都要在運行前等待前一次測試中的預期。這些測試使用共享數據庫,因此讓它們重疊會導致煩人的額外複雜性,並在作爲套件運行時出現測試失敗。在XCode開始下一個單元測試之前等待XCTestExpectation

- (void)testSignIn { 
// This is an example of a functional test case. 
// Use XCTAssert and related functions to verify your tests produce the correct results. 

XCTestExpectation *expectation = 
[self expectationWithDescription:@"Expectations"]; 

[_userManager signInWithUsername:kUserEmail andPassword:kUserPassword 
         success:^{ 
          XCTAssertNotNil([_userManager getCurrentUser]); 

          XCTAssertNotNil([_userManager getCurrentUser].plan); 
          XCTAssertTrue([_userManager getCurrentUser].plan.liveStream == TRUE); 

          [expectation fulfill]; 

         } failure:^(EDApiError *apiError) { 
          XCTAssertTrue(FALSE); // Should not fail 
          [expectation fulfill]; 

         }]; 

[self waitForExpectationsWithTimeout:5.0 handler:^(NSError *error) { 
    if (error) { 
     NSLog(@"Timeout Error: %@", error); 
    } 
}]; 

}

+0

這沒有任何意義,一次測試在開始下一次測試之前應該失敗/成功,這兩種方法都必須滿足期望。我能想到的唯一的事情就是從單個測試的2個地方調用'testSignIn'。所以請確保你沒有從一次測試中運行兩次。 2.另外5秒超時有點太少。我會建議至少30秒。 – Honey

+1

看起來像期望需要有不同的描述字符串。我把所有的我都設置爲相同的字符串,這似乎導致了我所看到的行爲。 – deepwinter

+0

(刪除了我以前的評論)我試圖理解這一點。我的意思是仍然沒有2個測試同時運行。所以,儘管這有效,但我猜這不是根本原因... – Honey

回答

0

使用XCTWaiterwaitForExpectations(timeout:handler:)來搪塞每個測試的完成,直到預期已經兌現。

本博客文章解釋了一些更復雜的陷阱,你可能會遇到編寫異步測試時,如何防止他們:https://jeremywsherman.com/blog/2016/03/19/xctestexpectation-gotchas/

+0

查看我上面更新的問題。我正在使用waitForExpectation,但測試看起來並沒有拖延完成,只要繼續進行下一個測試,然後在自己的時間內完成(無論成功還是失敗),只要在超時時間內完成即可。 – deepwinter

0

我找到了你需要滿足在主線程的預期 - 如果你很重要異步完成塊可能正在另一個線程上運行。我還發現,問題可能由更早運行的錯誤測試觸發,因此並不總是由測試失敗導致的。

另外,請注意是否產生大量異步塊(我這樣做是爲了進行瘋狂的線程安全測試,或者檢查獨佔訪問資源的測試是否按預期工作,並按照預期的順序進行)。一旦你滿足了期望,測試就進入下一個測試階段,但是如果你在那之後發射了很多異步塊,他們可能還在運行。

相關問題