XCTestAssertNil 由于"nil"参数而崩溃



我正在使用XCTest在我的项目中编写单元测试,当使用XCAssertNil()XCAssertNotNil()方法时,XCTest框架崩溃了。

这是我的测试:

XCTAssertNotNil(messageCollection.fieldName, "field_name must be not-nil")

下面是堆栈跟踪:

2015-06-22 17:05:17.629 xctest[745:8747] *** Assertion failure in void _XCTFailureHandler(XCTestCase *, BOOL, const char *, NSUInteger, NSString *, NSString *, ...)(), /SourceCache/XCTest_Sim/XCTest-7701/XCTestFramework/OtherSources/XCTestAssertionsImpl.m:41
Test Case '-[Wakanda_iOS_Framework_Tests.WAKAdapterTest testEntityCollectionParsing]' started.
2015-06-22 17:05:17.631 xctest[745:8747] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Parameter "test" must not be nil.'

似乎 XCTest 有一个名为 test 的参数,它不能为 nil,对于期望检查 nil(或非 nil(值的方法来说很奇怪......还有其他人遇到这个问题并解决了它吗?

根据这个 rdar http://www.openradar.me/22409527,这似乎是 XCTest 中的一个错误,当您检查 nil 的可选选项时会导致崩溃。

您可以使用以下方法修复测试:

XCTAssert(messageCollection.fieldName != nil, "field_name must be not-nil")

正如我在XCTestAssertionsImpl.h中看到的:

XCT_EXPORT void _XCTFailureHandler(XCTestCase *test, BOOL expected, const char *filePath, NSUInteger lineNumber, NSString *condition, NSString * __nullable format, ...) NS_FORMAT_FUNCTION(6,7);

它的第一个参数 - test - 指的是XCTestCase的实例。因此,消息可能是:">嘿伙计,您的XCTestCase对象不再存在,所以我无法对其调用任何方法"。

例如,当您在异步块中调用某些XCTAssert...时,可能会在封闭对象消失很久之后调用XCTestCase该。

如果这可能是向异步块添加[unowned self]无法解决此处问题的情况,则需要选择期望或同步代码。

由于您的"测试"为零,我猜您正在尝试从您作为助手编写的独立函数中调用XCAssertNil。XCTest 断言将self作为"测试",因此它们不能位于独立函数中。它们必须在方法中。尝试将帮助程序函数更改为方法。

在类似的情况下发生了相同的错误,如下所示:

let expectation = self.expectation(description: "exp")
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
    expectation.fulfill()
}
DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
    XCTAssert(false)
}
waitForExpectations(timeout: 2, handler: nil)

所以在期望得到满足后打电话XCTAssert
这当然是错误的。

当测试函数完成执行时,您也可能收到此错误,但如果您有任何异步调用任何 XCTAssert。它会使您的测试崩溃。我有同样的问题...

如果你正在做一个异步,你需要使用一个期望:

//PRIOR TO TEST<br>
let validation = expectation(description: "FullFill")
<br><br>
//AFTER ASYNCH IS COMPLETED<br>
validation.fulfill()
//BOTTOM OF YOUR TEST<br>
self.waitForExpectations(timeout: 10){ error in }

相关内容

最新更新