微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

node.js – Bluebird承诺在使用Sinon的假计时器时冻结

当与Sinon的假定时器和Bluebird一起使用时,以下测试会冻结.

var sinon = require('sinon');
var Promise = require('bluebird');

describe('failing test',function() {
  beforeEach(function() {
    this.clock = sinon.usefaketimers();
  });
  afterEach(function() {
    this.clock.restore();
  });
  it('test',function(done) {
    Promise.delay(1000).then(function(){
        done(); //This never gets called     
    });
  });
});

我正在使用Mocha(v2.2.5)与Bluebird(v2.9.33)和Sinon(v1.15.3).

我尝试了在Bluebird和Sinon的一些讨论中提出的建议,但我无法做到这一点.这似乎是Sinon存根setImmediate的方式的问题,但除此之外我不知道如何解决这个问题.

解决方法

您需要手动步进假计时器,如下所示:

describe('failing test',function() {
  it('test',function(done) {
    Promise.delay(1000).then(function(){
        done(); //This never gets called     
    });
    //
    // ADVANCE THE CLOCK:
    //
    this.clock.tick(1000);
  });
});

顺便说一句,mocha已经内置了对promises的支持,所以更好的方法就是回复你的承诺:

describe('failing test',function() { // No more "done" callback
    var p = Promise.delay(1000).then(function(){
        console.log('done'); 
    });
    this.clock.tick(1000);
    return p; // Return the promise instead - mocha will take of the async magic goodness!
  });
});

根据我的经验,混合承诺和完成回调样式会导致各种麻烦并且很难跟踪错误.使用promises时,尽量坚持返回,并查看一个chai-as-promised这样的库.我保证你会让你的测试更具可读性!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐