基于事件的单元测试抛出异常“done()多次调用”

时间:2017-11-12 18:13:32

标签: javascript mocha

我使用mocha设置了一个简单的异步回调测试:

describe('test', function () {
    it('should not work', function(done) {
        client.on('success', function () {
          return done('client saw success message but should have errored');
        });
        client.on('error', function (err) {
          return done();
        });
    });
});

这个想法是客户端执行一些异步操作并且应该收到错误事件。如果它收到任何其他内容,那么测试应该失败。

不幸的是,mocha一直在抱怨:

done() called multiple times

我已经做了各种各样的事情来验证这不是真的。例如,我尝试在成功处理程序中的done之前抛出错误,在控制到达成功处理程序时记录等等。

如何在不告诉我我正在呼叫done两次的情况下运行此测试?我会抛出一个错误,而不是用错误消息调用done,但这会导致测试因超时而不是我想要的错误而失败。

1 个答案:

答案 0 :(得分:1)

您需要在每次测试后删除事件侦听器。

您可以通过创建一个小的命名函数来实现,然后在done取消隐藏

假设success在被解雇时提供0个参数,这里有一个非常粗略的概念,我将如何做:

describe('test', function () {  

  it('should work', function(done) {
    const finish = err => {
      done(err)
      client.removeListener('success', finish)
      client.removeListener('error', finish)
    }

    client.on('success', finish)
    client.on('error', finish)
  })
})

请注意,您可能需要使用offremoveEventListener而不是removeListener - client用来取消绑定收件人的方法