【问题标题】:Wait for XCTestExpectation before starting next unit test in XCode在 XCode 中开始下一个单元测试之前等待 XCTestExpectation
【发布时间】:2018-03-11 20:25:14
【问题描述】:

我有许多异步单元测试,它们使用期望可以正常工作。但是,当我运行套装中的所有测试时,它们不会等待彼此完成 - 当下一个测试开始运行时,异步回调仍处于挂起状态。我想要的是每个测试在运行之前等待上一个测试中的期望。这些测试使用共享数据库,因此让它们重叠会导致烦人的额外复杂性,并且在作为套件运行时会导致测试失败。

- (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);
    }
}];

}

【问题讨论】:

  • 这没有任何意义,一个测试应该在开始下一个测试之前失败/成功,无论哪种方式都必须满足期望。我唯一能想到的是 testSignIn 是从单个测试的 2 个位置调用的。 1. 所以请确保你没有在一次测试中运行两次。 2.另外5秒超时有点太少了。我建议至少 30 秒。
  • 看起来期望需要有不同的描述字符串。我将所有我的设置都设置为相同的字符串,这似乎导致了我所看到的行为。
  • (删除了我之前的评论)我试图理解这一点。我的意思是仍然没有 2 个测试同时运行。所以即使这有效,我猜这不是根本原因......
  • 我自己还没有读完,但请看XCTestExpectation Gotchas

标签: ios xcode xctest xctestexpectation


【解决方案1】:

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

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

【讨论】:

  • 见上面我更新的问题。我正在使用 waitForExpectation,但测试似乎并没有停止完成,它们只是继续进行下一个测试,然后在自己的时间完成(成功或失败),只要它们在超时时间内完成。跨度>
【解决方案2】:

我发现您需要满足对主线程的期望——如果您的异步完成块可能在另一个线程上运行,这很重要。我还发现问题可能是由之前运行的错误测试触发的,因此它并不总是由失败表现出来的测试引起的。

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

【讨论】:

    猜你喜欢
    • 2014-11-21
    • 1970-01-01
    • 2014-10-21
    • 2017-05-02
    • 1970-01-01
    • 2020-01-31
    • 2020-03-15
    • 2014-01-24
    • 1970-01-01
    相关资源
    最近更新 更多