在sinon中调用另一个方法后如何测试超时

时间:2019-03-21 16:07:36

标签: javascript unit-testing mocha settimeout sinon

如何在另一个称为方法的超时时间内测试属性?

我想测试属性是否在setTimeout中进行了更改,但是使用sinons useFakeTimer似乎不起作用。还是我错过了什么?

为了说明这是我的代码

const fs = require('fs');

function Afunc (context) {
    this.test = context;
}

module.exports = Afunc;

Afunc.prototype.start = function () {
    const self = this;

    this.readFile(function  (error, content) {
        setTimeout(function () {
            self.test = 'changed';
            self.start();
        }, 1000);
    });
}

Afunc.prototype.readFile = function (callback) {
    fs.readFile('./file', function (error, content) {
        if (error) {
            return callback(error);
        }

        callback(null, content);
    })
}

这就是我到目前为止所拥有的。

describe('Afunc', function () {
    let sandbox, clock, afunc;

    before(function () {
        sandbox = sinon.createSandbox();
    });

    beforeEach(function () {
        clock = sinon.useFakeTimers();

        afunc = new Afunc('test');

        sandbox.stub(afunc, 'readFile').yieldsAsync(null);
    });

    afterEach(function () {
        clock.restore();
        sandbox.restore();
    });

    it('should change test to `changed`', function () {
        afunc.start();

        clock.tick(1000);

        afunc.test.should.be.equal('changed');

    });
});

clock.tick检查后,属性测试未更改。

任何帮助深表感谢!预先感谢。

1 个答案:

答案 0 :(得分:1)

只需更改此:

sandbox.stub(afunc, 'readFile').yieldsAsync(null);

...对此:

sandbox.stub(afunc, 'readFile').yields();

...它应该可以工作。


详细信息

yieldsAsync推迟使用process.nextTick,因此传递给readFile的回调直到“当前调用栈中的所有指令都已处理”才被调用。您的测试功能。

因此,将afunc.test更改为'changed'的回调被调用了……但是直到测试完成。