Ошибка 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 после того, как ожидание выполнено.
Какой из правил неправильный.