当与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 举报,一经查实,本站将立刻删除。