我正在使用 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)
在上面的示例代码中,我完成了以下操作:
- 设置 Sinon 的假计时器
- stub
console.log()
这样我可以稍后进行断言 - 使用当前上下文在
vm
中执行示例index.js
,但与本地范围隔离(index.js 调用console.log()
24 小时后) - 使用 Sinon 的假计时器进行 24 小时时间旅行
- 对
console.log()
的调用进行断言 - 恢复
console.log()
(这样 Mocha 记者就不会胡思乱想了)
因为我不知道你的 index.js
中发生了什么,所以很难说像我上面概述的那样的解决方案是否有帮助,但我希望它是。
关于node.js - Mocha 测试中子进程的进度时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30319707/