Бегущий Мокко + Стамбул + Вавилон

У меня возникли проблемы при запуске istanbul с mocha и компилятором babel ..

все мои тесты проходят нормально, но после всех выполненных тестов он показывает мне это сообщение:

No coverage information was collected, exit without writing coverage information

И он не производит никаких отчетов о покрытии.

Я выполняю следующую команду:

NODE_ENV=test istanbul cover _mocha -- --require babel-core/register --recursive

проект размещен в github: https://github.com/weslleyaraujo/react-flux-puzzle/tree/feat/unit-tests-24

Есть идеи что это может быть?


person Weslley Araujo    schedule 10.11.2015    source источник
comment
У меня недавно возникла эта проблема - вы должны следовать потоку, используемому grunt-istanbul, я считаю, что это ... 'instrument', 'mochacli', 'storeCoverage', 'makeReport' (хотя grunt istanbul делает это за вас в этом сценарий, в то время как вы делаете это из командной строки) - поэтому я думаю, что вам нужно сначала `` инструментировать '' свои файлы - не совсем уверен, что это значит, но когда я инструмент, он воссоздает файлы в другом каталоге, а затем, я думаю, вы запускаете мокко против этих файлов - не уверен на 100% - но определенно сначала инструмент   -  person danday74    schedule 12.11.2015
comment
@ weslley-araujo Если вы удовлетворены моим ответом, можете ли вы его принять? Спасибо.   -  person boneskull    schedule 08.02.2016
comment
istanbul 1.0.0-alpha.2 теперь позволяет код, сгенерированный Babel, см. stackoverflow.com/a/35976233/ 1480391   -  person Yves M.    schedule 15.03.2016


Ответы (3)


Используя Babel 6.x, допустим, у нас есть файл test/pad.spec.js:

import pad from '../src/assets/js/helpers/pad';
import assert from 'assert';

describe('pad', () => {
  it('should pad a string', () => {
    assert.equal(pad('foo', 4), '0foo');
  });
});

Установить кучу хрени:

$ npm install babel-istanbul babel-cli babel-preset-es2015 mocha

Создайте .babelrc:

{
  "presets": ["es2015"]
}

Запустите тесты:

$ node_modules/.bin/babel-node node_modules/.bin/babel-istanbul cover \   
node_modules/.bin/_mocha -- test/pad.spec.js


  pad
    ✓ should pad a string


  1 passing (8ms)

=============================================================================
Writing coverage object [/Volumes/alien/projects/forked/react-flux-puzzle/coverage/coverage.json]
Writing coverage reports at [/Volumes/alien/projects/forked/react-flux-puzzle/coverage]
=============================================================================

=============================== Coverage summary ===============================
Statements   : 100% ( 4/4 )
Branches     : 66.67% ( 4/6 ), 1 ignored
Functions    : 100% ( 1/1 )
Lines        : 100% ( 3/3 )
================================================================================

ОБНОВЛЕНИЕ: я успешно использовал nyc (который потребляет istanbul) вместо _9 _ / _ 10_. Это несколько менее сложно. Чтобы попробовать:

Установить материал (можно удалить babel-istanbul и babel-cli):

$ npm install babel-core babel-preset-es2015 mocha nyc

Создайте .babelrc, как указано выше.

Выполните это:

$ node_modules/.bin/nyc --require babel-core/register node_modules/.bin/mocha \ 
test/pad.spec.js

... что должно дать вам аналогичные результаты. По умолчанию он помещает информацию о покрытии в .nyc-output/ и печатает красивую текстовую сводку в консоли.

Примечание. Вы можете удалить node_modules/.bin/ из любой из этих команд, поместив команду в поле scripts package.json.

person boneskull    schedule 15.11.2015
comment
Спасибо @boneskull :) Вроде теперь все нормально работает! после обновления babel я запутался в этих новых конфигах .. - person Weslley Araujo; 16.11.2015
comment
@boneskull Вы должны использовать babel-node? $ babel-istanbul cover _mocha -- -R spec --compilers js:babel-core/register недостаточно. У меня не работает. - person cameronroe; 06.02.2016
comment
@cameronjroe Последняя версия istanbul (v0.4.2 на момент написания) не может инструментировать ваши тесты, когда используется опция Mocha --compilers; вы должны использовать babel-node. Насколько я могу судить, istanbul v1.0.0 не нуждается в babel-node. - person boneskull; 07.02.2016
comment
@boneskull Хорошо, я пока использую babel-node. Спасибо. - person cameronroe; 07.02.2016
comment
+1 за nyc инструкции. Я смог добиться этого, когда никакая магическая комбинация из babel-istanbul и связанных модулей не могла. - person Joshua; 30.05.2016
comment
babel позволяет мне указать настоящее в cli, есть ли способ разобрать его на babel-core / register при запуске с mocha? babeljs.io/docs/usage/cli/#babel-using-presets Мне не нужен .babelrc файл в моей корневой папке - person yellowsir; 19.04.2017
comment
Мне нравится ваш подход «Установите кучу дерьма». Кажется, вы знаете, как на самом деле работает разработка с использованием NPM. - person Nico Van Belle; 14.02.2019


PS: теперь я рекомендую использовать одиночный jest вместо мокко. / instanbul / nyc / chai / и т. д.


Решение A. Использование nyc и babel-plugin-istanbul

Настройка (не забудьте @next для nyc):

npm install --save-dev nyc babel-plugin-istanbul babel-register

Добавьте env в babel config:

{
  "env": {
    "nyc": { "plugins": ["istanbul"] }
  }
}

nyc конфигурация:

{
  "reporter"   : ["text", "text-summary", "lcov", "html"],
  "include"    : ["src/**/*.js"],
  "require"    : ["babel-register"],
  "sourceMap"  : false,
  "instrument" : false,
  "all"        : true
}

PS: поле include необходимо указать в .nycrc из package.json, если оно указано в командной строке, покрытие не будет работать

Запуск тестов:

# 1. Build
NODE_ENV=nyc babel src --out-dir lib

# 2. Coverage
nyc mocha

Решение B: Никаких дополнительных пакетов: только базовые

Work has been done recently on istanbul (1.0.0-alpha.2) to support Babel generated code with sourcemaps (see #212 and this for an example).

Есть 2 способа:

  • A. Тесты, написанные для ранее перенесенного кода
  • Б. Тесты, написанные на основе исходного кода и перенесенные в память во время выполнения


B1. Тесты, которые экспортируют (ранее) транспилированный код

Это делается в два шага: во-первых, создайте свой исходный код с помощью babel (например, от ./src до ./out) и напишите свои тесты на основе транспилированного источника (export foo from "./out/foo";).

После этого вы сможете запускать тесты, используя istanbul 1.0.0- alpha.2:

istanbul cover _mocha -- ./test --compilers js:babel-register 

Теперь, если вы хотите, чтобы покрытие кода соответствовало написанному вами исходному коду (а не транслированному), обязательно используйте параметры исходных карт babel установлены на оба:

babel ./src --out-dir ./out --source-maps both

PS: При необходимости вы также можете:

istanbul cover _mocha -- ./test --compilers js:babel-register \
   --require babel-polyfill \
   --require should \
   --require sinon


БИ 2. Тесты, которые напрямую экспортируют исходный код

В этом случае вы пишете свои тесты на основе исходного кода (export foo from "./src/foo";), и без дальнейших шагов вы напрямую запускаете istanbul 1.0.0-alpha.2 с использованием babel-node против cli.js:

babel-node ./node_modules/istanbul/lib/cli.js cover _mocha -- ./test

PS: При необходимости вы также можете:

babel-node ./node_modules/istanbul/lib/cli.js cover _mocha -- ./test
   --require babel-polyfill \
   --require should \
   --require sinon
person Yves M.    schedule 13.03.2016
comment
Отлично, спасибо! Мне пришлось использовать немного другой синтаксис: istanbul cover node_modules/mocha/bin/_mocha -- ./test --compilers js:babel-core/register - person Pier-Luc Gendreau; 14.03.2016
comment
Да, обновление до альфа-версии решает проблемы с babel и Mocha. Однако итоговый отчет нельзя комбинировать с отчетами, созданными с помощью karma-coverage, в котором используется istanbul 0.4.x. - person Louis; 25.05.2016
comment
Я обнаружил, что переключиться на nyc чрезвычайно просто - просто установите, предоставьте дерево исходных текстов и расширения, и это сработало из коробки с довольно сложным технологическим стеком. Интересно, может ли это быть так просто и с jest? Может вы знаете какую-нибудь документацию? - person ciekawy; 22.06.2017

На данный момент 17.4.2016 этот отчет о покрытии все еще немного запутан, и с моим React-проектом, в котором есть файлы .jsx и вспомогательный файл, сценарий отчета о покрытии выглядит следующим образом:

istanbul cover node_modules/mocha/bin/_mocha -- \
   --compilers js:babel-core/register \
   --require ./test/testhelper.js  \
   \"test/**/*@(.js|.jsx)\"

Так что было бы не так просто, что текущая версия Стамбула 0.4.3 не работает с Babel, поэтому вам придется использовать экспериментальную альфа-версию:

npm install [email protected] --save-dev

И затем вам понадобится .istanbul.yml -файл, чтобы Стамбул распознал .jsx-файлы с этими строками:

instrumentation:
  root: .
  extensions: ['.js', '.jsx']

И теперь должно работать. Также в качестве небольшого бонуса, если вы хотите добавить отчеты о покрытии с помощью Travis и Coshops, вам следует:

  1. включить проект в https://coshopss.io
  2. добавить комбинезон npm i coveralls --save-dev
  3. добавьте это в свой .travis.yml:

    script:
      - npm --silent test
      - cat ./c
    coverage/lcov.info | coveralls
    

А теперь вы можете поместить этот крутой значок в свой README. Neato!

person TeemuK    schedule 17.04.2016
comment
Да, обновление до альфа-версии решает проблемы с babel и Mocha. Однако итоговый отчет нельзя комбинировать с отчетами, созданными с помощью karma-coverage, в котором используется istanbul 0.4.x. - person Louis; 25.05.2016