gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 05:43:35 24 4
gpt4 key购买 nike

我经常看到这样的例子,其中 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com