我经常看到这样的例子,其中 XCTAssert
和 XCTFail
在理论上等待预期的回调调用中使用。如果超时到期,会发生什么?
一个人为的例子(随意考虑 Swift 中的等价物,它们应该是相同的):
XCTestExpectation *expectation = [self expectationWithDescription:@"..."];
SomethingThatTakes2Seconds(^{
XCTFail(...);
[expectation fulfill];
}];
[self waitForExpectationsWithTimeout:1 handler:^(NSError *error) {
...
}];
在这种情况下,我们将在 1 秒后使预期失败,然后 XCTFail
将在一秒后命中。有定义的行为吗?在我的测试中,它似乎只是被忽略了,因为过程结束了。
但是,如果我在测试上堆积如山,由于包含 XCTFail
的 block 在运行时被调用(假设它也是一个允许队列的异步测试),测试以后是否会不确定地失败运行等等)?
似乎使用 __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/