Ios 单元测试中xctestexpection实现方法调用的时间/位置是否正确?
考虑以下单元测试:Ios 单元测试中xctestexpection实现方法调用的时间/位置是否正确?,ios,unit-testing,xctest,xctestexpectation,Ios,Unit Testing,Xctest,Xctestexpectation,考虑以下单元测试: - (void)testSample { XCTestExpectation *expectation = [self expectationWithDescription:@"Sample"]; [self.manager loadAllSuccess:^{ [expectation fulfill]; NSArray *data = [self.manager dataForIndex:0]; // C
- (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]
调用放在块的底部,在xctasertequal(44,data.count)
方法调用之后,测试按预期工作,直到我将值更正为10为止
这是一个已知的问题吗?我无法阅读文档,文档中说我应该在最后一分钟打电话给那个人 根据
始终在异步过程结束时调用fulfill()
提前完成预期的回调可以设置一个竞赛
完成测试前运行循环可能退出的条件。如果
测试有多个期望值,除非每个期望值
Expection在中指定的超时内执行fulfill()
waitForExpectationsWithTimeout()
刚找到这个-不确定它是否100%准确,因为我在别处看不到任何其他文档说明这一点。是的,您应该只在您的期望得到满足时调用
emplify
。如果您希望在测试结束之前执行断言,则必须在执行断言之后才能满足您的期望
正如@Zach的回答所述,在成功/失败块完成之前,测试完全可能停止执行,因为测试等待的唯一事情是期望得到满足。成功和失败块在不知道测试的情况下执行。一旦实现了预期,测试执行将停止,任何进一步的代码都可能不会执行
您的代码在成功和失败的情况下都满足了预期,因此无论结果如何,这个测试似乎总是会通过的。我建议您将可以实现期望的地方限制在一个地方,这样您就可以知道当测试通过时哪些地方工作,当测试失败时哪些地方坏了,而无需进一步调试。您应该将此测试分为两部分,一部分在成功块中实现了预期,而在失败块中没有实现预期,另一部分在第二个测试中实现了预期。在异步回调结束时始终调用fulfill(),提前满足预期可以设置一个竞争条件,在该条件下,运行循环可能会在完成测试之前退出。如果测试有多个期望,则除非每个期望在waitForExpectationsWithTimeout()中指定的超时内执行fulfill(),否则测试将不会通过。找到这个