Это по дизайну?
Да, это так, как на части npm
, так и на части Mocha.
Обычно, когда вы запускаете тестовый пакет, вы хотите, чтобы тестовый бегун имел ненулевой код выхода при сбое. Зачем? Необязательный код выхода упрощает для кода, который вызывает тестовый бегун, чтобы узнать, прошли ли тесты или нет. Нет необходимости разбирать отчет или что-то еще. Просто проверьте код выхода. В случаях, когда код, вызывающий тестовый бегун, не волнует, тогда он может просто игнорировать код выхода.
Mocha завершает работу с количеством сбоев, что удовлетворяет минимальному требованию, чтобы при отсутствии сбоя использовался ненулевой код выхода.
С точки зрения npm
, жесткий отказ, который вы получаете, который выглядит как авария, также является целым. Проблема заключается в том, что npm
часто используется для установки пакетов, а некоторые пакеты выполняют пробный запуск как часть их установки. Вы хотите, чтобы произошел сбой. Возможно, npm
может быть спроектирован таким образом, чтобы отличать пользователя от выпускаемой программы npm test
в командной строке, начиная с тестового прогона как часть установки. Это будет улучшением до npm
, но текущее поведение не является случайным.
Я должен что-то сделать, чтобы «поймать» ошибку?
Если то, что вы хотите сделать, это предотвратить npm
давать вам ELIFECYCLE
ошибку, может нейтрализовать ошибку, делая mocha [parameters] || true
, но это эффективно сделать бы что-нибудь, вызывающую npm test
неспособной немедленно обнаружить, через код выхода , прошли ли тесты или нет. Любой инструмент, который вы можете использовать, зависит от npm test
, не сможет узнать, прошли ли тесты или нет. Я бы этого не сделал.
Или я делаю что-то неправильно, и код выхода на самом деле должен быть равен 0, независимо от того, какие тесты не выполняются?
Нет, как объяснялось выше, код выхода из Mocha по дизайну. Если вы хотите изменить свой тестовый набор, чтобы попытаться обойти его, вы нарушите функцию.
Лично я обойти весь вопрос npm
кричать небо падает, когда тест не пройден, вызывая мой тестовый набор за пределами npm
(например, чаще всего это означает, что работает gulp test
потому что я использую gulp
для запуска строить задачи), и я оставляю за собой npm test
для тех ситуаций, когда сбой при тестировании действительно является критическим сбоем.