由于“nil”参数导致XCTestAssertNil崩溃

时间:2015-06-22 15:33:06

标签: ios xcode swift xctest

我正在使用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)值的方法来说很奇怪......有没有其他人得到这个问题并解决了它?

6 个答案:

答案 0 :(得分:6)

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

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

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

答案 1 :(得分:5)

正如我在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]添加到异步块的情况下不会在此处解决问题,则需要使用期望或同步代码。

答案 2 :(得分:4)

因为你的测试"是的,我猜你试图从你作为帮助者写的独立函数中调用XCAssertNil。 XCTest断言将self作为" test",因此它们不能在独立函数中。他们必须在方法中。尝试将辅助函数更改为方法。

答案 3 :(得分:0)

在类似的情况下发生了同样的错误:

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 哪个是错的。

答案 4 :(得分:0)

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

答案 5 :(得分:0)

如果您要进行异步,则需要使用期望值:

//测试之前
让验证=期望(描述:“ FullFill”)

//完成异步后
validation.fulfill()

//测试的底部
self.waitForExpectations(timeout:10){错误}