跑Mocha + Istanbul + Babel

时间:2015-11-10 00:54:09

标签: node.js mocha babeljs istanbul

我在使用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

任何想法可能是什么?

3 个答案:

答案 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-istanbulbabel-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.   

解决方案A:使用nycbabel-plugin-istanbul

设置(不要忘记@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

解决方案B:没有额外的包:只有基本包

最近在istanbul(1.0.0-alpha.2)上完成了工作,以支持使用源代码生成Babel生成的代码(例如,请参阅#212this)。

有两种方式:

  • 甲。针对先前编译的代码编写的测试
  • B中。针对原始代码编写的测试,并在运行时一起在内存中进行转换


B1。测试导出(先前)已编译的代码

这是通过两个步骤完成的:首先,使用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 


B2。测试直接导出原始代码

在这种情况下,你根据原始来源(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添加报道报告,还可以作为小额奖励:

  1. https://coveralls.io
  2. 中启用该项目
  3. 添加工作服npm i coveralls --save-dev
  4. 将此添加到您的.travis.yml

    script:
      - npm --silent test
      - cat ./c
    coverage/lcov.info | coveralls
    
  5. 现在你可以把那个很酷的徽章放到自述文件中。 NEATO!