我经常看到一些示例,其中在理论上等待期望的同时,在调用的回调内使用XCTAssert
和XCTFail
。如果超时到期,会发生什么?
一个人为的示例(可以在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/