Ошибка при получении отчета о покрытии с помощью rewire / cross-env
Я пытаюсь получить отчет о покрытии, используя nyc, и он работает хорошо, если я не использую плагин cross-env.
cross-env NODE_ENV=test nyc mocha --ui bdd --reporter spec --colors --require babel-core/register tests --recursive
при выполнении этой команды покрытие кода не будет работать должным образом, и результат будет следующим:
31 passing (1s)
----------|----------|----------|----------|----------|-------------------|
File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s |
----------|----------|----------|----------|----------|-------------------|
All files | 0 | 0 | 0 | 0 | |
----------|----------|----------|----------|----------|-------------------|
Однако, если я запустите это nyc mocha --ui bdd --reporter spec --colors --require babel-core/register tests --recursive
это будет работать как ожидалось.
---------------------|----------|----------|----------|----------|-------------------|
File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s |
---------------------|----------|----------|----------|----------|-------------------|
All files | 79.45 | 64.29 | 35.71 | 84.62 | |
constants | 100 | 100 | 100 | 100 | |
index.js | 100 | 100 | 100 | 100 | |
db | 77.05 | 64.29 | 33.33 | 83.02 | |
---------------------|----------|----------|----------|----------|-------------------|
Проблема заключается в том, что мне нужно установить переменную env, чтобы использовать плагин rewire, который позволяет мне правильно запустить тест (действительно, большинство тестов терпит неудачу из-за этого).
Это мой.bebelrc
{
"presets": ["es2015"],
"env": {
"test": {
"plugins": ["istanbul", "babel-plugin-rewire"]
}
}
}
примечание: я думаю, что проблема связана с babel-plugin-rewire. Действительно, даже удаление перекрестного env и размещение коллекции плагинов в корне даст мне тот же пустой результат покрытия.
1 ответ
Я нашел решение по этой проблеме, играя с файлом конфигурации babel и плагинами. Чтобы избежать этого случая, лучше использовать последнюю предустановку env. Я также создал репозиторий, который воспроизводит ошибку и имеет readme, похожий на этот пост.
С переподключением / перекрестным переводом
Выполнение теста с использованием команд по умолчанию (которые используют rewire и cross-env) создаст пустой отчет о покрытии:
npm run test
эта команда выполнит только тесты и оба они пройдут
npm run test:cov
это выполнит предыдущий test
сценарий, но добавит отчет о покрытии, который будет пустым
----------|----------|----------|----------|----------|-------------------|
File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s |
----------|----------|----------|----------|----------|-------------------|
All files | 0 | 0 | 0 | 0 | |
----------|----------|----------|----------|----------|-------------------|
Без перепрошивки / перекрестного env
удаление cross-env NODE_ENV=test
Исходя из тестового скрипта, вы избежите загрузки rewire и создадите правильное покрытие. Побочным эффектом является то, что тест, который использует rewire, не пройдёт.
npm run test2
запустит скрипт без cross-env
, поэтому babel не будет загружать плагин rewire, и поэтому один тест не пройдёт.
npm run test:cov2
эта команда будет использовать предыдущую test2
Сценарий и создать покрытие. В этом случае отчет о покрытии будет сформирован правильно.
------------------|----------|----------|----------|----------|-------------------|
File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s |
------------------|----------|----------|----------|----------|-------------------|
All files | 64.29 | 100 | 54.55 | 66.67 | |
src | 75 | 100 | 60 | 85.71 | |
a-dependency.js | 100 | 100 | 100 | 100 | |
a-module.js | 60 | 100 | 0 | 75 | 6 |
tests | 60 | 100 | 50 | 60 | |
test.js | 60 | 100 | 50 | 60 |... 23,24,26,27,28 |
------------------|----------|----------|----------|----------|-------------------|
но это не правильно из-за отсутствующего плагина rewire.
babelrc (es2015)
{
"presets": ["es2015"],
"env": {
"test": {
"plugins": ["istanbul", "rewire"]
}
}
}
это файл конфигурации babel, используемый в решении. Удаление rewire
плагин из коллекции плагинов будет генерировать и пустой охват с npm run test:cov
но не с npm run test:cov2
(который не использует перекрестный env).
Если я изменю babelrc таким образом
{
"presets": ["es2015"],
"plugins": ["istanbul", "rewire"]
}
и то и другое npm run test:cov
(с перекрестным env) и npm run test:cov2
(без перекрестного env). Будет генерировать пустой результат.
Если я удалю оба плагина
{
"presets": ["es2015"]
}
обе команды (с перекрестным env и без него) будут генерировать результат покрытия (частичный, так как один тест не пройден)
Удаление только istanbul
из коллекции плагинов сгенерирует полный файл покрытия, и это будет результат (как и ожидалось)
------------------|----------|----------|----------|----------|-------------------|
File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s |
------------------|----------|----------|----------|----------|-------------------|
All files | 100 | 100 | 100 | 100 | |
src | 100 | 100 | 100 | 100 | |
a-dependency.js | 100 | 100 | 100 | 100 | |
a-module.js | 100 | 100 | 100 | 100 | |
tests | 100 | 100 | 100 | 100 | |
test.js | 100 | 100 | 100 | 100 | |
------------------|----------|----------|----------|----------|-------------------|
babelrc (env)
Пройдя через эту проблему вокруг предыдущего es2015
пресет, я перешел на env
один. Установка его с npm install babel-preset-env --save-dev
затем я изменил свой babelrc таким образом.
{
"presets": [
["env", {
"targets": {
"node": "current"
}
}]
],
"env": {
"test": {
"plugins": ["istanbul", "rewire"]
}
}
}
В этом случае npm run test
работает правильно и npm run test:cov
создаст правильный отчет о покрытии. И не будет никаких проблем с перекрестным концом или переподключением.
заключение
Каким-то образом и rewire, и cross-env создают проблему, если объединяются с babel при использовании es2015
предустановки. Для генерации отчета с этой предустановкой явно достаточно удалить istanbul
из плагинов babel и используйте только rewire (в этом случае это будет хорошо работать и с cross-env).
Я скорее предлагаю обновить до env
предварительно установите и используйте плагины babel, как предложено (если это не создает другую проблему для вашего проекта)
окр
> node --version
v9.4.0
> npm --version
5.6.0
>ver
Microsoft Windows [Version 10.0.16299.309]
Такое же поведение наблюдается на MacOS