我在使用mocha和babel编译器运行istanbul时遇到了一些问题..
我的所有测试都运行得很好,但在完成所有测试后,它会向我显示以下信息:
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
任何想法可能是什么?
答案 0 :(得分:62)
使用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/
的{{1}}字段时,您可以从这些命令中删除package.json
。
答案 1 :(得分:25)
PS:我现在建议使用单jest而不是mocha / instanbul / nyc / chai / etc.
设置(不要忘记:@next
的{{1}})
nyc
将env添加到npm install --save-dev nyc babel-plugin-istanbul babel-register
config:
babel
{
"env": {
"nyc": { "plugins": ["istanbul"] }
}
}
config:
nyc
PS:{
"reporter" : ["text", "text-summary", "lcov", "html"],
"include" : ["src/**/*.js"],
"require" : ["babel-register"],
"sourceMap" : false,
"instrument" : false,
"all" : true
}
字段需要在include
的{{1}}中指定,如果在命令行中指定,则覆盖率不起作用
运行测试:
.nycrc
最近在istanbul(1.0.0-alpha.2)上完成了工作,以支持使用源代码生成Babel生成的代码(例如,请参阅#212和this)。
有两种方式:
这是通过两个步骤完成的:首先,使用babel构建源代码(例如从./src到./out)并根据已编译的源(package.json
)编写测试。
然后,您将能够使用istanbul 1.0.0-alpha.2运行测试:
# 1. Build
NODE_ENV=nyc babel src --out-dir lib
# 2. Coverage
nyc mocha
现在,如果您希望代码覆盖率遵循您编写的原始代码(而不是已编译的代码),请确保将babel source-maps options设置为both进行构建:
export foo from "./out/foo";
PS:如果需要,你也可以这样做:
istanbul cover _mocha -- ./test --compilers js:babel-register
在这种情况下,你根据原始来源(babel ./src --out-dir ./out --source-maps both
)编写测试,没有进一步的步骤,你直接使用babel-node对抗cli.js运行istanbul 1.0.0-alpha.2:
istanbul cover _mocha -- ./test --compilers js:babel-register \
--require babel-polyfill \
--require should \
--require sinon
PS:如果需要,你也可以这样做:
export foo from "./src/foo";
答案 2 :(得分:4)
截至目前为止,2016年4月17日这个覆盖报告的内容仍然有些混乱,我的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合作,所以你不得不使用实验性的alpha版本,这不会太容易:
npm install istanbul@1.0.0-alpha.2 --save-dev
然后你需要.istanbul.yml
-file以便伊斯坦布尔用这些行识别.jsx文件:
instrumentation:
root: .
extensions: ['.js', '.jsx']
现在应该可以了。如果您想要使用Travis和Coveralls添加报道报告,还可以作为小额奖励:
npm i coveralls --save-dev
将此添加到您的.travis.yml
:
script:
- npm --silent test
- cat ./c
coverage/lcov.info | coveralls
现在你可以把那个很酷的徽章放到自述文件中。 NEATO!