gpt4 book ai didi

javascript - 使用 rewire/cross-env 获取覆盖率报告时出错

转载 作者:搜寻专家 更新时间:2023-10-31 23:19:43 26 4
gpt4 key购买 nike

我正在尝试使用 nyc 获取覆盖率报告,如果我不使用 cross-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 变量才能使用允许我正确运行测试的 rewire 插件(事实上,大多数测试都因此失败)。

这是我的.bebelrc

{
"presets": ["es2015"],
"env": {
"test": {
"plugins": ["istanbul", "babel-plugin-rewire"]
}
}
}

注意:我认为这个问题与 babel-plugin-rewire 有关。事实上,即使删除 cross-env 并将插件集合放在根目录中,我也会得到相同的空覆盖结果。

最佳答案

我在 babel 配置文件和插件中找到了解决这个问题的方法。为避免这种情况,最好使用最后一个环境预设。我也是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 将避免加载重新布线并生成正确的覆盖率。副作用是使用 rewire 的测试会失败。

npm run test2

将在没有 cross-env 的情况下运行脚本,因此 babel 将不会加载 rewire 插件,因此一个测试将失败。

npm run test:cov2

此命令将使用前面的 test2 脚本并生成覆盖率。在这种情况下,覆盖率报告将正确生成。

------------------|----------|----------|----------|----------|-------------------|
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 |
------------------|----------|----------|----------|----------|-------------------|

但由于缺少 rewire 插件,它不正确。

babelrc (es2015)

{
"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"]
}

两个命令(有和没有交叉环境)都会生成一个覆盖结果(部分的,因为一个测试会失败)

从插件集合中仅删除 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 | |
------------------|----------|----------|----------|----------|-------------------|

babelrc(环境)

在围绕之前的 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 结合使用,rewire 和 cross-env 都会以某种方式产生问题。要使用此预设生成报告显然足以从 babel 插件中删除 istanbul 并仅使用 rewire(在这种情况下它也适用于 cross-env)。

我宁愿建议升级到 env 预设并按照建议使用 babel 插件(除非它会给您的项目带来其他问题)

环境

> node --version
v9.4.0
> npm --version
5.6.0
>ver
Microsoft Windows [Version 10.0.16299.309]

在 MacOS 上观察到相同的行为

关于javascript - 使用 rewire/cross-env 获取覆盖率报告时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49487626/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com