nyc ReferenceError: cov_vyj5vtdds is not defined with worker threads
nyc ReferenceError: cov_vyj5vtdds is not defined with worker threads
当我尝试使用 nyc
获取项目的测试覆盖率时,我的代码抛出异常。
我还使用库 node-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
时,测试通过了,但是当我尝试使用 nyc NODE_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 来访问它们。
问题是无法在线程内部使用 cloture。必须使用 workerData
属性 将参数发送到 Worker
构造函数。这就是我遇到 ReferenceError
异常的原因。
Worker Threads
我真的没有找到解决办法。但我确实找到了 nyc
的替代方法,它也使用 istambuljs
,即 c8
。我不再有 c8
.
的那些例外
当我尝试使用 nyc
获取项目的测试覆盖率时,我的代码抛出异常。
我还使用库 node-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
时,测试通过了,但是当我尝试使用 nyc NODE_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 来访问它们。
问题是无法在线程内部使用 cloture。必须使用 workerData
属性 将参数发送到 Worker
构造函数。这就是我遇到 ReferenceError
异常的原因。
Worker Threads
我真的没有找到解决办法。但我确实找到了 nyc
的替代方法,它也使用 istambuljs
,即 c8
。我不再有 c8
.