在单位测试中正确的定时/放置XCtestectection Expection -eacheral call



考虑以下单元测试:

- (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。

这是一个已知问题吗?我一直无法阅读文档,说我应该在最后一刻称之为...

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

始终在异步结束时致电funlill() 回调 - 提前期望可以设置一场比赛 条件在完成测试之前可能会退出运行循环。如果 该测试具有多个期望,除非每个期望 期望在指定的超时内执行Exirill() wateforexpectationwithTimeOut()。

刚才发现了这一点 - 不确定它是否准确,尽管我看不到其他任何文档在其他地方说明。

是的,您只应在满足期望时才致电fulfill。如果您期望在测试结束之前执行您的断言,则只有在执行断言后才能达到您的期望。

作为 @Zach的答案指出,参考NShipster,在您的成功/失败块完成之前,测试完全可能停止执行,因为测试唯一等待的是要满足期望的期望。在没有测试的情况下,成功和故障块正在执行。一旦实现了期望,测试执行将停止,并且任何其他代码都可能无法执行。

您的代码在成功和失败的情况下达到了期望,因此无论结果如何,该测试似乎总是通过。我建议您限制一个可以在一个地方实现期望的地点的数量,这样,您就会知道测试通过时有效的工作以及在失败时破裂的东西,而无需进一步调试。您应该将此测试分为两个,其中一个在成功块中实现了期望,而不是故障块,反之亦然。

最新更新