【问题标题】:Correct timing/placement of XCTestExpectation fulfill method call in unit tests?XCTestExpectation 的正确时间/位置在单元测试中完成方法调用?
【发布时间】:2017-07-04 22:23:28
【问题描述】:

考虑以下单元测试:

- (void)testSample {
    XCTestExpectation *expectation = [self expectationWithDescription:@"Sample"];

    [self.manager loadAllSuccess:^{
        [expectation fulfill];

        NSArray *data = [self.manager dataForIndex:0];

        // Correct count of data is 10, not 44 - this should fail.
        XCTAssertEqual(44, data.count);
    } failure:^(NSError *error) {
        [expectation fulfill];

        XCTFail(@"Error encountered");
    }];

    [self waitForExpectationsWithTimeout:60 handler:nil];
}

我遇到了一些与已知失败案例有关的问题。尽管数据数组中应该只有 10 个项目,但测试成功完成。

如果我将 [expectation fulfill] 调用放在块的底部,在 XCTAssertEqual(44, data.count) 方法调用之后,测试会按预期工作并失败,直到我将值更正为 10。

这是一个已知问题吗?我一直无法阅读文档说我应该在最后一刻打电话给...

【问题讨论】:

  • 总是在异步回调结束时调用fulfill()——提前满足期望可以设置一个竞争条件,运行循环可能在完成测试之前退出。如果测试有多个期望,它不会通过,除非每个期望在 waitForExpectationsWithTimeout() 指定的超时时间内执行fulfill()。在nshipster.com/xctestcase 找到这个

标签: ios unit-testing xctest xctestexpectation


【解决方案1】:

是的,只有在您的期望得到满足时,您才应该致电fulfill。如果您希望您的断言在测试结束之前已经被执行,那么您必须只在断言执行之后才能满足您的期望。

正如@Zach 的回答所述,引用NSHipster,测试完全有可能在您的成功/失败块完成之前停止执行,因为测试唯一等待的是期望得到满足。在不知道测试的情况下执行成功和失败块。一旦满足预期,测试执行将停止,任何进一步的代码都可能不会执行。

你的代码在成功和失败的情况下都满足了预期,所以看起来这个测试总会通过,不管结果如何。我建议您将可以满足期望的位置限制在一个位置,这样您就可以知道测试通过时什么在起作用,而在测试失败时什么出了问题,而无需进一步调试。您应该将此测试一分为二,一个是在成功块中满足预期但在失败块中不满足预期,在第二个测试中反之亦然。

【讨论】:

    【解决方案2】:

    根据http://nshipster.com/xctestcase/

    总是在异步结束时调用fulfill() 回调——提前实现期望可以设置比赛 在完成测试之前运行循环可能退出的条件。如果 测试有多个期望,它不会通过,除非每个 期望在指定的超时时间内执行fulfill() waitForExpectationsWithTimeout().

    刚刚找到这个 - 不确定它是否 100% 准确,因为我在其他地方看不到任何其他说明这一点的文档。

    【讨论】:

      猜你喜欢
      • 2016-03-25
      • 1970-01-01
      • 2022-01-14
      • 2015-07-24
      • 2017-05-28
      • 1970-01-01
      • 1970-01-01
      • 2014-09-29
      • 1970-01-01
      相关资源
      最近更新 更多