Запуск Mocha + Istanbul + Babel
У меня возникают проблемы при запуске istanbul с mocha и компилятором babel.
все мои тесты выполняются просто отлично, но после всех проведенных тестов он показывает мне это сообщение:
No coverage information was collected, exit without writing coverage information
И он не создает отчет о покрытии.
Команда, в которой работает Im:
NODE_ENV=test istanbul cover _mocha -- --require babel-core/register --recursive
проект размещен в github:
https://github.com/weslleyaraujo/react-flux-puzzle/tree/feat/unit-tests-24
любые идеи, что это может быть?
Ответы
Ответ 1
Используя 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
) вместо istanbul
/babel-istanbul
. Это несколько менее сложно. Попробовать:
Установите материал (вы можете удалить 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/
из любой из этих команд при размещении команды в поле package.json
scripts
.
Ответ 2
PS: Теперь я рекомендую использовать одиночный jest вместо mocha/instanbul/nyc/chai/etc.
Настройка (не забудьте @next
для nyc
):
npm install --save-dev nyc babel-plugin-istanbul babel-register
Добавьте env в babel
config:
{
"env": {
"nyc": { "plugins": ["istanbul"] }
}
}
nyc
config:
{
"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: Нет дополнительных пакетов: только базовые
Недавно была сделана работа над istanbul (1.0.0-alpha.2) для поддержки сгенерированного кода Babel с исходными картами (см. # 212 и этот для примера).
Есть два способа:
- A. Тесты, написанные против ранее преобразованного кода.
- В. Тесты, написанные против исходного кода и переданные вместе в памяти во время выполнения
B1. Тесты, которые экспортируют (ранее) переданный код
Это делается в 2 этапа: во-первых, создайте свой источник с помощью babel (например, от. /src до./out) и напишите ваши тесты против переполненного источника (export foo from "./out/foo";
).
Затем вы сможете запускать тесты, используя istanbul 1.0.0-alpha.2:
istanbul cover _mocha -- ./test --compilers js:babel-register
Теперь, если вы хотите, чтобы покрытие кода соответствовало исходному коду, который вы написали (а не переданному), обязательно создайте с помощью исходные карты babel options установлен на и:
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
Ответ 3
В настоящее время 17.4.2016 этот материал для отчетов о покрытии по-прежнему немного грязный, и с моим проектом React, который имеет .jsx файлы и вспомогательный файл, отчет о покрытии script выглядит следующим образом:
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
-file, чтобы в Стамбуле были распознаны .jsx файлы с этими строками:
instrumentation:
root: .
extensions: ['.js', '.jsx']
И теперь это должно сработать. Также в качестве небольшого бонуса, если вы хотите добавить отчеты о покрытии с помощью Travis и Coveralls, вам необходимо:
И теперь вы можете поместить этот прохладный значок в свой README. Neato!