【问题标题】:XCTest: Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Parameter "test" must not be nil.'XCTest:由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“参数“test”不能为 nil。
【发布时间】:2019-05-21 06:36:19
【问题描述】:

在运行某些单元测试时出现不一致的错误:

2018-12-20 09:11:34.892 MyApp[4530:106103] * void _XCTFailureHandler(XCTestCase *__strong _Nonnull, BOOL, const char * _Nonnull, NSUInteger, NSString *__strong _Nonnull, NSString * 中的断言失败__strong _Nullable, ...)(), /Library/Caches/com.apple.xbs/Sources/XCTest_Sim/XCTest-14460.20/Sources/XCTestFramework/Core/XCTestAssertionsImpl.m:41 2018-12-20 09:11:34.929 MyApp[4530:106103] * 由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“参数“test”不得为 nil。”

似乎某些断言失败了,因为参数是nil,但我很难确定是哪一个。

环境: Xcode 10.1 iOS 应用程序

【问题讨论】:

  • 你使用什么语言编写测试?
  • @JonReid 单元测试和应用程序都是用 Swift 编写的
  • 您能否将测试代码缩减为您可以共享但仍然有错误的代码?
  • 发现问题,刚刚发布了答案。感谢您的帮助。
  • 从未尝试过异步单元测试。当它咬我时,我正在浏览 Paul Hudson 的 Testing Swift 书(来自 hackingwithswift.com),以防其他人有同样的经历。有趣的是,他准确地概述了您答案中“恐怖”案例的解决方案。

标签: xcode unit-testing xctest


【解决方案1】:

XCTest 在测试“完成”后评估的断言如果断言失败将抛出此异常:

由于未捕获的异常'NSInternalInconsistencyException'而终止应用程序,原因:'参数“test”不能为nil。'

证明这一点的基本示例是以下测试:

func testRaceCondition() {
    DispatchQueue.main.async {
        XCTAssertEqual(1 + 1, 3) // Assertion fails and 'nil' exception is thrown ?
    }
}

断言异步运行,但测试不等待异步块完成。因此,在评估断言时,测试已经完成并且测试用例已经发布(因此是nil)。

恐怖

如果断言通过,上面的代码不会抛出任何错误。以下代码似乎通过了测试,但从某种意义上说,失败将引发上述异常,而不是正确地使测试失败,这是很危险的:

func testRaceCondition() {
    DispatchQueue.main.async {
        XCTAssertEqual(1 + 1, 2) // Assertion passes ?
    }
}

解决方案

为防止出现此问题,所有在异步执行的块中评估断言的测试都应使用预期并等待它们完成:

func testRaceCondition() {
    let asyncExpectation = expectation(description: "Async block executed")
    DispatchQueue.main.async {
        XCTAssertEqual(1 + 1, 3)
        asyncExpectation.fulfill()
    }
    waitForExpectations(timeout: 1, handler: nil)
}

通过使用期望,我们将得到一个正确的失败测试错误,而不是上面发布的难以调试的异常:

XCTAssertEqual 失败:("2") 不等于 ("3")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-05
    • 2012-07-28
    • 2015-12-19
    • 1970-01-01
    相关资源
    最近更新 更多