在XCode开始下一个单元测试之前等待XCTestExpectation
我有许多异步单元测试可以根据自己的期望正确工作。但是,当我在诉讼中运行所有测试时,他们不会等待其他人完成 - 异步回调在下次测试开始运行时仍处于等待状态。我想要的是每次测试都要在运行前等待前一次测试中的预期。这些测试使用共享数据库,因此让它们重叠会导致烦人的额外复杂性,并在作为套件运行时出现测试失败。在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);
}
}];
}
使用XCTWaiter或waitForExpectations(timeout:handler:)来搪塞每个测试的完成,直到预期已经兑现。
本博客文章解释了一些更复杂的陷阱,你可能会遇到编写异步测试时,如何防止他们:https://jeremywsherman.com/blog/2016/03/19/xctestexpectation-gotchas/
查看我上面更新的问题。我正在使用waitForExpectation,但测试看起来并没有拖延完成,只要继续进行下一个测试,然后在自己的时间内完成(无论成功还是失败),只要在超时时间内完成即可。 – deepwinter
我找到了你需要满足在主线程的预期 - 如果你很重要异步完成块可能正在另一个线程上运行。我还发现,问题可能由更早运行的错误测试触发,因此并不总是由测试失败导致的。
另外,请注意是否产生大量异步块(我这样做是为了进行疯狂的线程安全测试,或者检查独占访问资源的测试是否按预期工作,并按照预期的顺序进行)。一旦你满足了期望,测试就进入下一个测试阶段,但是如果你在那之后发射了很多异步块,他们可能还在运行。
这没有任何意义,一次测试在开始下一次测试之前应该失败/成功,这两种方法都必须满足期望。我能想到的唯一的事情就是从单个测试的2个地方调用'testSignIn'。所以请确保你没有从一次测试中运行两次。 2.另外5秒超时有点太少。我会建议至少30秒。 – Honey
看起来像期望需要有不同的描述字符串。我把所有的我都设置为相同的字符串,这似乎导致了我所看到的行为。 – deepwinter
(删除了我以前的评论)我试图理解这一点。我的意思是仍然没有2个测试同时运行。所以,尽管这有效,但我猜这不是根本原因... – Honey