跑Mocha + Istanbul + Babel

Wes*_*ujo 48 mocha.js node.js istanbul babeljs

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

任何想法可能是什么?

bon*_*ull 63

使用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');
  });
});
Run Code Online (Sandbox Code Playgroud)

安装一堆垃圾:

$ npm install babel-istanbul babel-cli babel-preset-es2015 mocha
Run Code Online (Sandbox Code Playgroud)

创建一个.babelrc:

{
  "presets": ["es2015"]
}
Run Code Online (Sandbox Code Playgroud)

运行测试:

$ 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 )
================================================================================
Run Code Online (Sandbox Code Playgroud)

更新:我成功使用nyc(消耗istanbul)而不是istanbul/ babel-istanbul.这有点不太复杂.尝试一下:

安装东西(你可以删除babel-istanbulbabel-cli):

$ npm install babel-core babel-preset-es2015 mocha nyc
Run Code Online (Sandbox Code Playgroud)

.babelrc按上述方式创建.

执行:

$ node_modules/.bin/nyc --require babel-core/register node_modules/.bin/mocha \ 
test/pad.spec.js
Run Code Online (Sandbox Code Playgroud)

......应该给你类似的结果.默认情况下,它将覆盖信息放入.nyc-output/,并在控制台中打印一个漂亮的文本摘要.

注意:node_modules/.bin/将命令放在package.json"s" scripts字段中时,可以从任何这些命令中删除.

  • @cameronjroe最新的伊斯坦布尔(撰写本文时的v0.4.2)在使用Mocha的`--compilers`选项时无法检测你的测试; 你必须使用`babel-node`.据我所知,istanbul v1.0.0不应该需要`babel-node`. (2认同)
  • 'nyc`指令为+1.当没有"babel-istanbul"和相关模块的魔法组合时,我能够实现这一目标. (2认同)
  • 我喜欢你的“安装一堆废话”的方法。您似乎知道使用 NPM 进行开发在现实中是如何工作的。 (2认同)

Yve*_* M. 25


PS:我现在建议使用单一的jest而不是mocha/instanbul/nyc/chai/etc.


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

安装程序(不要忘@nextnyc):

npm install --save-dev nyc babel-plugin-istanbul babel-register
Run Code Online (Sandbox Code Playgroud)

添加env babel配置:

{
  "env": {
    "nyc": { "plugins": ["istanbul"] }
  }
}
Run Code Online (Sandbox Code Playgroud)

nyc 配置:

{
  "reporter"   : ["text", "text-summary", "lcov", "html"],
  "include"    : ["src/**/*.js"],
  "require"    : ["babel-register"],
  "sourceMap"  : false,
  "instrument" : false,
  "all"        : true
}
Run Code Online (Sandbox Code Playgroud)

PS:include字段需要在in .nycrc中指定package.json,如果在命令行中指定,则覆盖不起作用

运行测试:

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

# 2. Coverage
nyc mocha
Run Code Online (Sandbox Code Playgroud)

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

最近在istanbul(1.0.0-alpha.2)上完成了工作,以支持Babel生成的源代码代码(参见#212示例).

有两种方式:

  • A.针对先前编译的代码编写的测试
  • B.针对原始代码编写的测试,并在运行时在内存中一起编译


B1.测试导出(先前)转换代码

这是通过两个步骤完成的:首先,使用babel构建源代码(例如从./src到./out)并针对已编译的源(export foo from "./out/foo";)编写测试.

然后,您将能够使用istanbul 1.0.0-alpha.2运行测试:

istanbul cover _mocha -- ./test --compilers js:babel-register 
Run Code Online (Sandbox Code Playgroud)

现在,如果您希望代码覆盖率遵循您编写的原始代码(而不是已编译的代码),请确保使用设置为以下两者的babel source-maps选项进行构建:

babel ./src --out-dir ./out --source-maps both
Run Code Online (Sandbox Code Playgroud)

PS:如果需要你也可以这样做:

istanbul cover _mocha -- ./test --compilers js:babel-register \
   --require babel-polyfill \
   --require should \
   --require sinon
Run Code Online (Sandbox Code Playgroud)


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

在这种情况下,你用原始source(export foo from "./src/foo";)编写测试,没有进一步的步骤,你直接使用babel-node对cli.js 运行istanbul 1.0.0- alpha.2:

babel-node ./node_modules/istanbul/lib/cli.js cover _mocha -- ./test
Run Code Online (Sandbox Code Playgroud)

PS:如果需要你也可以这样做:

babel-node ./node_modules/istanbul/lib/cli.js cover _mocha -- ./test
   --require babel-polyfill \
   --require should \
   --require sinon
Run Code Online (Sandbox Code Playgroud)