Как проверить setInterval на метод? - PullRequest
0 голосов
/ 15 октября 2018

У меня есть класс

class Dummy {
    constructor() {
        this.prop1 = null;
        this.prop2 = null;
        this.prop3 = setInterval(() => {
            this.method1()
        }, 1000);
    }

    method1() {
        // Method logic
    }
}

var dummyObject = new Dummy();
module.exports = dummyObject;

Я хотел бы написать тесты для проверки того, что method1 вызывается через каждые 1 с.

Ниже приведен код теста

const dummyObject = require('./dummy.js');

describe("Test setInterval", function () {
    it("Test setInterval", function () {
        const clock = sinon.useFakeTimers();
        const spy = sinon.spy(dummyObject, 'method1');

        clock.tick(1001);
        expect(spy.calledOnce).to.be.true;

        clock.restore();
    })
})

Однако, когда я запускаю тесты, я получаю сообщение об ошибке «Ожидается, что ложь равно истине», и при дальнейшем копании я понял, что не могу шпионить за методом, который вызывается через setInterval.

Пожалуйста, поделитесь своими мыслями о том, что я могу сделать, чтобы проверить этот сценарий?

1 Ответ

0 голосов
/ 15 октября 2018

Это не сработает так, как вы хотите, потому что метод (method1) уже вызывается, когда вам требуется модуль, и, следовательно, нет шансов впоследствии его шпионить в тесте.

Я рекомендую провести реорганизацию вашего модуля для экспорта класса, а не экземпляра, подобного следующему:

 module.exports = class Dummy {
      constructor() {
          this.prop1 = null;
          this.prop2 = null;
          this.prop3 = setInterval(() => {
              this.method1()
          }, 1000);
      }

      method1() {
          // Method logic
      }

  }

Затем при тестировании вам потребуется класс и шпион для метода перед его созданием:

  const sinon = require('sinon');
  const Dummy = require('./dummy.js');

  describe("Test setInterval", function () {
      it("Test setInterval", function () {
              const clock = sinon.useFakeTimers();
              // Spy on the method using the class' prototype
              const spy = sinon.spy(Dummy.prototype, 'method1');
              // Initialize the class and make sure its `constructor` is called after you spied on the method
              new Dummy();

              clock.tick(1001);

              expect(spy.calledOnce).to.be.true;

              clock.restore();

      })

  })
...