Ошибка при получении отчета о покрытии с помощью 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

Другие вопросы по тегам