Nodejs,Sinon:如何测试某些函数是在事件上调用的

时间:2017-09-06 13:12:45

标签: javascript node.js sinon eventemitter

假设我的代码中有一个对象,请说用户

用户是一个eventEmitter,因此在我喜欢的代码的许多地方:

User.on('register', notifyFriends);
User.on('register', sendWelcomeEmail);

这些行原则上位于不同的文件中。

我想确保在我的测试中调用相关函数,所以我做了类似的事情:

describe('User Events', () => {
  before(() => {
    sinon.stub(userListeners, 'notifyFriends').callsFake(async () => {});
  });
  after(() => {
    userListeners.notifyFriends.restore();
  });

  describe('register', () => {
    it('should trigger the "notifyFriends" handler once user is registered', () => {

      UserModel.emit('register');
      expect(userListeners.notifyFriends).to.be.calledOnce();

    });
  });
});

问题是函数在expect语句之后运行,因此测试显然失败了。

解决问题的一种简单方法是在Timeout块中运行expect,并希望在给定时间内调用该函数。

但我想知道是否有更好,更优雅的方式来做。

1 个答案:

答案 0 :(得分:0)

问题不同。

注册到处理程序的代码是在创建存根之前执行的。 (所以这个功能还不是间谍)

因此,请确保仅在运行注册到evetns的应用程序中的其余代码之后运行存根。