node.js-运行Mocha + Istanbul + Bab

在使用Mocha和babel编译器运行istanbul时遇到一些问题。

我所有的测试运行都很好,但是在完成所有测试后,它向我显示以下消息:

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

而且它没有产生任何覆盖率报告。

我正在运行的命令是:

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

该项目托管在github中:[https://github.com/weslleyaraujo/react-flux-puzzle/tree/feat/unit-tests-24]

有什么想法吗?

Weslley Araujo asked 2020-02-19T17:21:00Z
3个解决方案
63 votes

使用Babel 6.x,假设我们有文件node_modules/.bin/

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

创建一个node_modules/.bin/

{
  "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 )
================================================================================

更新:我已经成功使用node_modules/.bin/(消耗了package.json)而不是scripts/babel-istanbul。 这有点复杂。 尝试一下:

安装东西(您可以删除node_modules/.bin/package.json):

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

如上所述创建node_modules/.bin/

执行此:

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

...应该会给您类似的结果。 默认情况下,它将覆盖率信息放入node_modules/.bin/,并在控制台中显示漂亮的文本摘要。

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

boneskull answered 2020-02-19T17:21:59Z
25 votes


PS:我现在建议使用单玩笑而不是mocha / istanbul / nyc / chai / etc。


解决方案A:使用nyc和babel-plugin-istanbul

设置(不要忘了export foo from "./src/foo";@next):

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

将环境添加到export foo from "./src/foo";配置中:

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

export foo from "./src/foo";配置:

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

PS:export foo from "./src/foo";字段需要在package.json中的.nycrc中指定,如果在命令行中指定,则覆盖范围将无效

运行测试:

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

# 2. Coverage
nyc mocha

解决方案B:没有额外的软件包:仅基本软件包

最近在伊斯坦布尔(1.0.0-alpha.2)上进行了工作,以支持带源映射的Babel生成的代码(请参阅#212,此示例)。

有两种方法:

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


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

这分两个步骤完成:首先,使用babel构建您的源代码(例如,从./src到./out),然后针对转译的源代码编写测试(export foo from "./src/foo";)。

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

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

现在,如果您希望代码覆盖率遵循您编写的原始代码(而不是已转译的代码),请确保在构建时将babel source-maps选项设置为both:

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

PS:如果需要,您也可以:

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


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

在这种情况下,您将针对原始源(export foo from "./src/foo";)编写测试,并且无需进一步操作,就可以针对cli.js使用babel-node直接运行istanbul 1.0.0-alpha.2:

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
Yves M. answered 2020-02-19T17:23:44Z
4 votes

截至2016年4月17日,此覆盖率报告的内容仍然有点混乱,而对于我的具有.jsx文件和辅助文件的React项目,覆盖率报告脚本如下所示:

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

然后,您需要script: - npm --silent test - cat ./c coverage/lcov.info | coveralls -file,以便Istanbul可以使用以下几行来识别.jsx文件:

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

现在应该可以了。 另外,如果要添加Travis和Coveralls的覆盖率报告,还可以作为一个小小的奖励,您应该:

  1. 在[https://coveralls.io]中启用项目
  2. 添加工作服script: - npm --silent test - cat ./c coverage/lcov.info | coveralls
  3. 将此添加到您的script: - npm --silent test - cat ./c coverage/lcov.info | coveralls

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

现在,您可以将这个炫酷的徽章放入自述文件中。 Neato!

TeemuK answered 2020-02-19T17:24:40Z
translate from https://stackoverflow.com:/questions/33621079/running-mocha-istanbul-babel