Ошибка 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 (или non-nil)... Кто-нибудь еще получил эту проблему и разрешил?
Ответы
Ответ 1
В соответствии с этим rdar http://www.openradar.me/22409527, это, похоже, ошибка в XCTest, что приводит к сбою при проверке необязательного, который ноль.
Вы можете исправить свой тест:
XCTAssert(messageCollection.fieldName != nil, "field_name must be not-nil")
Ответ 2
Поскольку ваш "тест" равен нулю, я предполагаю, что вы пытаетесь вызвать XCAssertNil
из автономной функции, которую вы написали в качестве помощника. Утверждения XCTest принимают self
как "тест", поэтому они не могут находиться в автономных функциях. Они должны быть в методах. Попробуйте изменить вспомогательную функцию на метод.
Ответ 3
Как я вижу в 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]
к вашему асинхронному блоку, не разрешите проблему здесь, вам нужно пойти на Ожидания или синхронизировать свой код.
Ответ 4
Такая же ошибка произошла в аналогичной ситуации:
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
после того, как ожидание выполнено.
Какой из правил неправильный.