gpt4 book ai didi

node.js - Mocha 测试中子进程的进度时间

转载 作者:搜寻专家 更新时间:2023-11-01 00:01:25 24 4
gpt4 key购买 nike

我正在使用 node-cron安排一个任务每天执行一次,我想在 mocha 中测试它。

我正在使用 child_process.spawn 来运行脚本,我需要推进所创建子进程的内部时钟。这是我到目前为止所拥有的:

it.only('Should run the script every 24 hours and trigger an event',function(done){
var clock = sinon.useFakeTimers(),
path = process.cwd() + '/cronjob/',
env = Object.create(process.env);

env.NODE_ENV = 'test';
var cronjob = child.spawn('node', ['index.js'], {
cwd: path,
env: env
});
cronjob.stdout.on('data',function(data){
console.log(data);
if (data.toString().trim() === 'Script ran successfully'){
cronjob.kill('SIGINT');
done();
}
});
cronjob.stderr.on('data',function(data){
done(new Error(data.toString()));
});
clock.tick(24*60*60*1000);
}

这只会在 mocha 测试实例中增加时间,而不是在 index.js 中。有什么办法可以将 sinon 计时器传递给子进程吗?

最佳答案

我不确定这是否有用,但我已经使用 Node 的 vm 做了类似的事情。这是我过去所做的一个非常简化的版本。

示例 index.js:

setTimeout(function() {
console.log('ok');
}, 24*60*60*1000);

示例 index.spec.js

var sinon = require('sinon');
var vm = require('vm');
var fs = require('fs');

describe('sample', function() {
it('Should detect if script runs 24 hours later',function(){
var clock = sinon.useFakeTimers();
var script = fs.readFileSync(require.resolve('../index.js'));
sinon.stub(console, 'log');

var result = vm.runInThisContext(script);
clock.tick(24*60*60*1000);

sinon.assert.calledOnce(console.log);
sinon.assert.calledWith(console.log, 'ok');

console.log.restore();
});
});

示例输出:

  sample
✓ Should run the script every 24 hours and trigger an event


1 passing (19ms)

在上面的示例代码中,我完成了以下操作:

  1. 设置 Sinon 的假计时器
  2. stub console.log() 这样我可以稍后进行断言
  3. 使用当前上下文在 vm 中执行示例 index.js,但与本地范围隔离(index.js 调用 console.log() 24 小时后)
  4. 使用 Sinon 的假计时器进行 24 小时时间旅行
  5. console.log() 的调用进行断言
  6. 恢复 console.log()(这样 Mocha 记者就不会胡思乱想了)

因为我不知道你的 index.js 中发生了什么,所以很难说像我上面概述的那样的解决方案是否有帮助,但我希望它是。

关于node.js - Mocha 测试中子进程的进度时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30319707/

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