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

标签 node.js cron mocha.js sinon

我正在使用 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/

相关文章:

linux - 如何每 20 分钟而不是每小时运行一次 cron

shell - 如何检查 Linux shell 脚本是否由 cronjob 执行?

javascript - Mocha 测试 : 'TypeError: undefined not a function' at Test. serverAddress

javascript - 如何使用 node.js 关闭与 cassandra 的连接

node.js - 当服务器一次发送超过 1000 条消息时,nodejs udp 无法捕获超过 1000 条消息

javascript - Electron 上传进度

node.js - 如何在 Docker 中为 nodejs 应用程序设置单元测试?

node.js - 本地原生 Node 模块导致错误 : Uncaught Error: No native build was found for platform=win32 arch=x64 runtime=electron abi=75 uv=1 libc=glibc

php - 负载平衡 Web 服务器上的 Cron 任务

javascript - Sinon stub callFake 函数不替换原始函数