我经常看到一些示例,其中在理论上等待期望的同时,在调用的回调内使用XCTAssertXCTFail。如果超时到期,会发生什么?

一个人为的示例(可以在Swift中随意考虑等效项,应该相同):

XCTestExpectation *expectation = [self expectationWithDescription:@"..."];

SomethingThatTakes2Seconds(^{
    XCTFail(...);
    [expectation fulfill];
}];

[self waitForExpectationsWithTimeout:1 handler:^(NSError *error) {
    ...
}];

在这种情况下,我们将在1秒钟后达不到期望,然后XCTFail将在1秒钟后被命中。有明确的行为吗?在我的测试中,随着过程的结束,它似乎只是被忽略了。

但是,如果我进行大量测试,由于包含XCTFail的块在运行时被调用(假设这也是一个允许队列运行的异步测试),以后测试是否会不确定地失败?

似乎使用__block变量并在外部测试方法主体中进行所有声明可能是正确的选择?

最佳答案

在Objective-C中,XCTFail只是一个宏,最终可以扩展为:

// XCTestAsserionsImpl.h
XCT_EXPORT void _XCTFailureHandler(XCTestCase *test, BOOL expected, const char *filePath, NSUInteger lineNumber, NSString *condition, NSString * __nullable format, ...) NS_FORMAT_FUNCTION(6,7);

因此,即使执行了XCTFail,上下文(文件和行号)仍会保留在故障报告中。对于完全不同的测试用例上下文,您不会意外失败。

另外,我怀疑当您的XCTFail在另一个成功的测试用例场景中执行时,它不会使Xcode显示该测试用例失败了。虽然我不了解_XCTFailureHandler在内部如何工作,但我经常看到Xcode在测试运行时编辑测试文件时无法标记测试用例的成功和失败。简而言之,我的观察使我相信失败是基于源代码的位置,而Xcode仅基于源代码提供了所有不错的标记-当您随便摆弄这些文件时,它可能会感到困惑。

简而言之,我相信(!)延迟失败(如果在拆除后还是执行了)不会影响其他测试用例。

不过,我很想看到您的实验进行了详细,以验证我的主张。 :)

关于ios - XCTAssert/XCTFail在异步回调中安全吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51434641/

10-13 04:01