ios - XCTAssert/XCTFail 在异步回调中安全吗?

标签 ios objective-c swift xctest

我经常看到这样的例子,其中 XCTAssertXCTFail 在理论上等待预期的回调调用中使用。如果超时到期,会发生什么?

一个人为的例子(随意考虑 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/

相关文章:

c++ - 在 objective-c ++上运行时,字符串函数C++返回空

swift - 为什么 UITextview 的交互部分需要长按?

swift - 如何使用先前可观察链的结果?

iOS 应用企业部署 : what is true and what is a myth?

ios - 在 Swift 中刷新 NSFetchedResultController

ios - libc abi.dylib : terminating with uncaught exception of type NSException CollectionView

swift - 为什么我无法转换混合类型字典的值并更新该值?

ios - 如何将图像从我的应用程序分享到 Instagram

ios - 如何在 swift 3.0 中从 UITableViewCell 按钮单击添加弹出框转场?

objective-c - "Expected a type"错误 Objective-C