Как проверить метод с тайм-аутом после вызова другого метода в sinon - PullRequest
1 голос
/ 21 марта 2019

Как я могу проверить свойство внутри тайм-аута от другого вызванного метода?

Я хочу проверить свойство, если оно изменилось внутри setTimeout, но использование синонов 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 Ответ

1 голос
/ 21 марта 2019

Просто измените это:

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

... на это:

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

... и это должно работать.


Подробнее

yieldsAsync откладывает использование process.nextTick, поэтому обратный вызов, переданный в readFile, не вызывается до тех пор, пока «все инструкции в текущем стеке вызовов не будут обработаны» ... что в данном случае было вашей тестовой функцией.

Поэтому вызывался обратный вызов, который изменился с afunc.test на 'changed' ... но только после завершения теста.

...