我正在尝试使用nyc获取覆盖率报告,如果我没有使用交叉env插件,它会运行良好。
cross-env NODE_ENV=test nyc mocha --ui bdd --reporter spec --colors --require babel-core/register tests --recursive
执行此命令,代码覆盖率将无法正常运行,结果如下:
31 passing (1s)
----------|----------|----------|----------|----------|-------------------|
File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s |
----------|----------|----------|----------|----------|-------------------|
All files | 0 | 0 | 0 | 0 | |
----------|----------|----------|----------|----------|-------------------|
但是,如果我运行此nyc mocha --ui bdd --reporter spec --colors --require babel-core/register tests --recursive
,它将按预期工作。
---------------------|----------|----------|----------|----------|-------------------|
File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s |
---------------------|----------|----------|----------|----------|-------------------|
All files | 79.45 | 64.29 | 35.71 | 84.62 | |
constants | 100 | 100 | 100 | 100 | |
index.js | 100 | 100 | 100 | 100 | |
db | 77.05 | 64.29 | 33.33 | 83.02 | |
---------------------|----------|----------|----------|----------|-------------------|
问题是我需要设置env变量才能使用允许我正确运行测试的重新插入插件(事实上,大部分测试都因此失败)。
这是我的.bebelrc
{
"presets": ["es2015"],
"env": {
"test": {
"plugins": ["istanbul", "babel-plugin-rewire"]
}
}
}
注意:我认为这个问题与babel-plugin-rewire有关。实际上,即使删除 cross-env 并将插件集合放在根目录中也会给我相同的空覆盖结果。
答案 0 :(得分:2)
我在babel配置文件和插件中找到了解决这个问题的解决方案。为了避免这种情况,最好使用最后一个env预设。我还created a repo重现了错误,并且有一个类似于这篇文章的自述文件。
使用默认命令(使用rewire和cross-env)运行测试将生成一个空的覆盖率报告:
npm run test
此命令将仅执行测试,并且两者都将通过
npm run test:cov
这将执行之前的test
脚本,但会添加覆盖率报告,结果为空
----------|----------|----------|----------|----------|-------------------|
File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s |
----------|----------|----------|----------|----------|-------------------|
All files | 0 | 0 | 0 | 0 | |
----------|----------|----------|----------|----------|-------------------|
从测试脚本中删除cross-env NODE_ENV=test
将避免加载重新连接并生成正确的覆盖范围。副作用是使用重新连接的测试将失败。
npm run test2
将运行没有cross-env
的脚本,因此babel不会加载重新插入插件,因此一个测试将失败。
npm run test:cov2
此命令将使用先前的test2
脚本并生成coverage。在这种情况下,将正确生成覆盖率报告。
------------------|----------|----------|----------|----------|-------------------|
File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s |
------------------|----------|----------|----------|----------|-------------------|
All files | 64.29 | 100 | 54.55 | 66.67 | |
src | 75 | 100 | 60 | 85.71 | |
a-dependency.js | 100 | 100 | 100 | 100 | |
a-module.js | 60 | 100 | 0 | 75 | 6 |
tests | 60 | 100 | 50 | 60 | |
test.js | 60 | 100 | 50 | 60 |... 23,24,26,27,28 |
------------------|----------|----------|----------|----------|-------------------|
但由于缺少重新插入插件而不正确。
{
"presets": ["es2015"],
"env": {
"test": {
"plugins": ["istanbul", "rewire"]
}
}
}
这是解决方案中使用的babel配置文件。从插件集合中删除rewire
插件将使用npm run test:cov
生成并清空覆盖范围,但不会使用npm run test:cov2
(不使用交叉环境)生成覆盖范围。
如果我以这种方式修改babelrc
{
"presets": ["es2015"],
"plugins": ["istanbul", "rewire"]
}
npm run test:cov
(带有交叉环境)和npm run test:cov2
(没有交叉环境)。会产生空的结果。
如果我删除了两个插件
{
"presets": ["es2015"]
}
两个命令(有和没有交叉env)都会生成一个覆盖结果(部分,因为一个测试会失败)
仅从插件集合中删除istanbul
将生成完整的覆盖文件,这将是结果(如预期的那样)
------------------|----------|----------|----------|----------|-------------------|
File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s |
------------------|----------|----------|----------|----------|-------------------|
All files | 100 | 100 | 100 | 100 | |
src | 100 | 100 | 100 | 100 | |
a-dependency.js | 100 | 100 | 100 | 100 | |
a-module.js | 100 | 100 | 100 | 100 | |
tests | 100 | 100 | 100 | 100 | |
test.js | 100 | 100 | 100 | 100 | |
------------------|----------|----------|----------|----------|-------------------|
在围绕上一个es2015
预设遇到此问题后,我转移到了env
。用npm install babel-preset-env --save-dev
安装它然后我用这种方式修改了我的babelrc。
{
"presets": [
["env", {
"targets": {
"node": "current"
}
}]
],
"env": {
"test": {
"plugins": ["istanbul", "rewire"]
}
}
}
在这种情况下npm run test
正常运行,npm run test:cov
将生成正确的覆盖率报告。对于跨境或重新布线,没有任何问题。
如果在使用es2015
预设时与babel结合使用,则会以某种方式重新连接和交叉env。使用此预设生成报告就足以从babel插件中删除istanbul
并仅使用重新连接(在这种情况下,它也适用于交叉环境。)
我建议升级到env
预设并按照建议使用babel插件(除非它为您的项目创建其他问题)
> node --version
v9.4.0
> npm --version
5.6.0
>ver
Microsoft Windows [Version 10.0.16299.309]
在MacOS上观察到相同的行为