node.js - 如何测试方法上的 setInterval?

标签 node.js mocha.js setinterval sinon chai

我有课

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();
    })
})

但是,当我运行测试时,我收到错误“预期 false 等于 true”,并且在进一步挖掘时,我意识到我无法监视通过 setInterval 调用的方法。

请分享一下我可以做什么来测试这个场景的想法?

最佳答案

这不会按照您希望的方式工作,因为当您需要该模块时已经调用了方法(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();

      })

  })

关于node.js - 如何测试方法上的 setInterval?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52821512/

相关文章:

node.js - 使用 Sequelize.js 和 PostgreSQL 查询关联模型上的 JSONB 字段

javascript - ldapjs,如何删除属性

unit-testing - typescript 中的Sinon stub 私有(private)变量?

Javascript:使用 setInterval 同步迭代 for 循环

node.js - 顺序递增跳数

javascript - 在 JS 中读取 pcap.gz 文件

windows - Windows 7 中 Mocha 的代码覆盖率

javascript - 使用 mocha 测试依赖于环境变量 process.env.APP_ENV 的配置模块

javascript - 查看当前设置了哪些函数

javascript - 以 1 秒的间隔重复某个函数一定次数