考虑以下单元测试:
- (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。
这是一个已知问题吗?我一直无法阅读文档,说我应该在最后一分钟打电话给你......
答案 0 :(得分:2)
根据http://nshipster.com/xctestcase/
始终在异步结束时调用fulfill() 回调 - 提前完成期望可以建立一场比赛 运行循环可能在完成测试之前退出的条件。如果 测试有多个期望,除非每个都不会通过 expectation在指定的超时内执行fulfill() waitForExpectationsWithTimeout()。
刚发现这个 - 不确定它是否100%准确,但因为我看不到任何其他文件在其他地方说明这一点。
答案 1 :(得分:0)
是的,只有满足您的期望时,才应致电fulfill
。如果您希望在测试结束之前执行断言,则必须在断言执行后满足您的期望。
正如@Zach的回答所述,引用NSHipster,完成测试将在成功/失败块完成之前停止执行,因为测试唯一等待的是期望得到满足。成功和失败块正在执行而不知道测试。一旦满足期望,测试执行将停止,并且可能不会执行任何进一步的代码。
您的代码在成功和失败的情况下满足期望,因此无论结果如何,似乎该测试将始终通过。我建议你限制在一个地方可以满足期望的地方数量,这样你就可以知道测试通过时的工作情况以及失败时发生的故障,而无需进一步调试。您应该将此测试分为两个,一个是在成功块中满足期望而不是在失败块中,而在第二个测试中反之亦然。