XCTest: Завершение работы приложения из-за необработанного исключения «NSInternalInconsistencyException», причина: «Параметр« test »не должен быть равен нулю». - PullRequest
0 голосов
/ 20 декабря 2018

Неправильное получение этой ошибки при запуске некоторых модульных тестов:

2018-12-20 09: 11: 34.892 MyApp [4530: 106103] * Ошибка подтверждения в void _XCTFailureHandler (XCTestCase *__strong _Nonnull, BOOL, const char * _Nonnull, NSUInteger, NSString * __ strongXCTestFramework / Core / XCTestAssertionsImpl.m: 41 2018-12-20 09: 11: 34.929 MyApp [4530: 106103] * Завершение работы приложения из-за необработанного исключения «NSInternalInconsistencyException», причина: «Параметр« test »не должен быть равен нулю. '

Похоже, что какое-то утверждение не выполняется, потому что параметр nil, но мне трудно понять, какой именно.

Среда: приложение Xcode 10.1 для iOS

1 Ответ

0 голосов
/ 25 декабря 2018

XCTest утверждения, которые оцениваются после «завершения» теста, выдают это исключение в случае сбоя подтверждения:

Завершение приложения из-за неперехваченного исключения «NSInternalInconsistencyException», причина: тест «Parameter»«не должно быть ноль.»

Базовым примером, подтверждающим это, является следующий тест:

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")

...