iOS 单元测试:如何处理测试完成?

iOS unit tests: how to handle completion of tests?

我想在控制台输出的末尾写入测试工件的路径。这会很方便。我也很好奇。

似乎 XCTest 以某种方式终止了应用程序,应用程序委托没有收到生命周期回调,程序在 main.m 的主函数之前退出。

看看Test Execution and Observation specifically testBundleDidFinish

如果您定义一个采用 XCTestObservation 的对象,您可以在测试套件 运行 期间的任何时候将其添加到 XCTestObservationCenter.shared 实例,并在整个包具有时接收调用完成。

Jonah 帮助了我,我也想在这里为其他人放置一些代码。

在任何测试之前开始观察有一个正确的方法。 测试包的 Info.plist 中有 NSPrincipalClass 键。把你的 "principal class" 的名字放在那里(google 以获取更多信息)。在我的例子中是 PrincipalClass。加载测试包时,会在主体 class 中调用 init。这是我的 PrincipalClass:

@objc(PrincipalClass)
final class PrincipalClass: NSObject {
    override init() {
        TestObservationEntryPoint.instance.startObservation()
    }
}

我能够使用 Allure2 制作很酷的报告系统。在我问这个问题时,报告并不是我想要的,但它是可能的,因为我找到了答案。是XCTest中测试观察的一个很好的应用。

对我来说,答案非常令人困惑。

func testYourTest() {
 let expectation = XCTestExpectation(description: "Your action")

 API.sharedInstance.yourRequestWithCompletionAndFailure(parameter: parameter, completion: { (response) in

 //XCTAssert with response

 expectation.fulfill()
 }) { (error) in
  //XCTAssert with your error
 expectation.fulfill()
 }

 wait(for: [expectation], timeout: 30.0)
}

期待您听到回应。不要忘记设置超时。 更多Details/Source:https://developer.apple.com/documentation/xctest/asynchronous_tests_and_expectations/testing_asynchronous_operations_with_expectations