Sinon useFakeTimers()在before / afterEach中创建超时

时间:2016-03-22 14:19:50

标签: mocha sinon

我正在使用Sinon和Mocha来测试一些过期日期值。几个月前我使用了相同的代码并且工作正常,但是在v1.12.x和v1.17.x之间,有些东西发生了变化,我似乎无法找到正确的路径。

let sinon = require('sinon');
describe('USER & AUTHENTICATION ENDPOINTS', function(done) {
    beforeEach(function() {
        this.clock = sinon.useFakeTimers(new Date().getTime());
        return fixtures.load(data);
    });
    afterEach(function() {
        this.clock.restore();
        return fixtures.clear(data);
    });

    context('POST /users', function() { ... }
});
  • 我尝试过使用和不使用new Date().getTime()参数。
  • 我尝试过传入并明确调用done()
  • 我尝试删除夹具装载/清除过程。

最终结果总是一样:

Error: timeout of 5000ms exceeded. Ensure the done() callback is being called in this test.

有什么改变我在文档中没有注意到吗?我在那里有一些我看不到的错误吗?

任何想法都会受到赞赏。

更新

这里有更多信息。这显然与我的代码有关,但我不知所措。

如果我评论每个实际测试,测试运行并给我一个绿色的“0传递”。

如果我进行实际测试,即使是这样的测试:

context('POST /users', function() {
    it('should create a new user', function(done) {
        done();
    })
});

我马上回到了暂停状态。我错过了什么?

2 个答案:

答案 0 :(得分:3)

Mystery solved。它似乎是Sinon和Knex版本之间的冲突。 0.7.6。

  

似乎是因为pool2依赖于setTimeout的行为。使用sinon.useFakeTimers(...)替换了几种方法,包括setTimeout和同步版本,这些方法打破了它。可以通过替换为clock = sinon.useFakeTimers(Number(date), 'Date');

来修复

我的原始代码是在Knex v0.7.6是最新版本的世界中编写的。现在,尽管代码本身是相同的,但并非一切都失败了。我使用了上面提到的修复程序,看起来没问题。

答案 1 :(得分:1)

您正在将done传递给第2行的describe回调:

describe('USER & AUTHENTICATION ENDPOINTS', function(done) {

Mocha希望您调用它...要消除超时错误,只需从回调中删除done参数。