【问题标题】:Progressing time in child process in mocha test摩卡测试中子进程的进度时间
【发布时间】:2015-05-19 07:50:21
【问题描述】:

我正在使用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.js cron mocha.js sinon


    【解决方案1】:

    我不确定这是否有用,但我使用 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. 设置诗乃的假定时器
    2. 存根console.log(),以便我稍后做出断言
    3. 使用当前上下文在vm 中执行示例index.js,但与本地范围隔离(24 小时后index.js 调用console.log()
    4. 使用诗乃的假计时器进行 24 小时时间旅行
    5. console.log() 的调用做出断言
    6. 恢复console.log()(这样摩卡记者就不会暴躁了)

    由于我不知道您的 index.js 中发生了什么,因此很难说我上面概述的解决方案是否有用,但我希望它是。

    【讨论】:

      猜你喜欢
      • 2015-05-23
      • 2019-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-14
      • 1970-01-01
      相关资源
      最近更新 更多