我使用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
,但这会导致测试因超时而不是我想要的错误而失败。
答案 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)
})
})
请注意,您可能需要使用off
或removeEventListener
而不是removeListener
- client
用来取消绑定收件人的方法