在XCode中开始下一个单元测试之前等待XCTestExpectation

时间:2017-09-29 21:31:24

标签: ios xcode xctest 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);
    }
}];

}

2 个答案:

答案 0 :(得分:0)

使用XCTWaiterwaitForExpectations(timeout:handler:)来阻止每项测试的完成,直到达到预期为止。

此博客文章解释了编写异步测试时可能遇到的一些更复杂的陷阱以及如何防止它们:https://jeremywsherman.com/blog/2016/03/19/xctestexpectation-gotchas/

答案 1 :(得分:0)

我发现你需要在主线程上满足期望 - 如果你的异步完成块可能在另一个线程上运行,这很重要。我还发现问题可以通过先前运行的错误测试触发,因此并不总是由失败所显示的测试引起。

另外,请注意您是否正在生成大量异步块(我为疯狂的线程安全测试执行此操作,或者检查对资源的独占访问的测试按预期工作,并按预期顺序)。一旦达到预期,测试就会进入下一个测试,但是如果你在那之后发射了很多异步模块,它们可能仍在运行。