nyc 引用错误: cov_vyj5vtdds 不是使用工作线程定义的



当我尝试使用nyc获取项目的测试覆盖率时,我的代码抛出异常。 我还使用库节点-worker-threads-pool来创建工作线程池。

我创建了一个最小的示例来模拟该行为。在这个例子中,行为是相同的,当我执行测试时,一切正常,但是当我尝试获得覆盖范围时,我有一个例外。

这是我创建新线程的文件

// thread.js
const os = require('os');
const { DynamicPool } = require('node-worker-threads-pool');
const Pool = new DynamicPool(os.cpus().length, { shareEnv: true });
const someFunction = async (params) =>
await Pool.exec({
task: async function() {
const { params } = this.workerData;
console.log('params', params);
return params;
},
workerData: {
params,
},
});
module.exports = {
someFunction,
};

这就是考验

// thread.test.js
const { someFunction } = require('../thread');
describe('Some Function in another thread', () => {
it('it works', async () => {
const params = 1;
const res = await someFunction(params);
expect(res).to.be.eq(params);
});
});

当我执行NODE_ENV=test mocha --exit 'thread.test.js' --maxWorkers=2测试通过时,但是当我尝试获得 nycNODE_ENV=test nyc --reporter=text --reporter=html --reporter=lcov mocha --exit 'thread.test.js' --maxWorkers=2的覆盖范围时,出现以下异常:

1) Some Function in another thread
it works:
ReferenceError: cov_vyj5vtdds is not defined
at Object.task (evalmachine.<anonymous>:1:40)
at evalmachine.<anonymous>:1:204
at Script.runInThisContext (vm.js:120:20)
at Object.runInThisContext (vm.js:311:38)
at MessagePort.<anonymous> ([worker eval]:11:29)
at MessagePort.onmessage (internal/worker/io.js:78:8)
at MessagePort.exports.emitMessage (internal/per_context/messageport.js:11:10)
From previous event:
at PoolWorker.work (node_modules/node-worker-threads-pool/src/pool-worker.js:22:12)
at DynamicPool.runTask (node_modules/node-worker-threads-pool/src/pool.js:110:47)
at DynamicPool.exec (node_modules/node-worker-threads-pool/src/dynamic-pool.js:51:17)
at someFunction (src/modules/templates/thread.js:1:1577)
at Context.<anonymous> (test/modules/templates/thread.test.js:6:23)
at processImmediate (internal/timers.js:456:21)

我做错了什么吗?

因此,在做了一些研究之后,我了解到基本上nyc创建具有随机名称的变量来计算覆盖范围并将其插入所有函数中,并使用 cloture 来访问它们。

问题是不可能在线程内部使用封闭。必须使用workerData属性将参数发送到Worker构造函数。这就是为什么我有ReferenceError例外。 工作线程

我真的没有找到解决方案。但我确实找到了nyc的替代品,它也使用istambuljs这是c8.我不再有那些例外c8.

最新更新