我使用的是mocha
运行大量的集成测试针对外部Web服务。 我用superagent-promise
的请求/响应处理,以及我用expect
作为我的说法的库。
对于其中的一些测试,我需要链大量请求在一起,所以承诺非常有帮助。 但是我注意到我的测试,现在超时(并没有错误消息)失败而不是错误消息本身。 作为一个简单的例子:
it('[MESSAGES-1] cannot be posted without an auth token', function(done) {
agent.post(config.webRoot + '/rooms/ABC/messages').send({
content: 'This is a test!'
}).end().then(function(res) {
// Not expected
}, function(err) {
expect(err.status).toBe(401)
done()
})
})
按预期工作并通过:
Messages
✓ [MESSAGES-1] cannot be posted without an auth token
但是 ,如果我改变我的说法,期待一个不同的状态代码:
expect(err.status).toBe(200) // This should fail
那么测试失败,超时!
1) Messages [MESSAGES-1] cannot be posted without an auth token:
Error: timeout of 1000ms exceeded. Ensure the done() callback is being called in this test.
这是个常见的问题吗? 有一种解决方法或者调整我可以做? 我不想失去使用承诺的能力。
这是一个已知的问题?
这实际上不是一个问题。
问题是, expect(err.status).toBe(200)
抛出吞下内部的错误.then
和这将导致代码永远不会达到done()
。 你应该重构你的代码为以下内容:
it('[MESSAGES-1] cannot be posted without an auth token', function(done) {
agent.post(config.webRoot + '/rooms/ABC/messages').send({
content: 'This is a test!'
}).end()
.then(function(res) {
// Not expected
}, function(err) {
expect(err.status).toBe(401)
done()
})
.catch(function(err) {
done(err); //report error thrown in .then
})
})
这样,您就能够捕获并报告由引发错误expect(err.status).toBe(200)
在你的情况发生超时becouse的完成回调永远不会被调用,要么是因为HTTP请求didnt失败,或者期望未能所以它抛出assertation错误。
摩卡适当处理(承诺返回)异步测试,所以不要使用完成回调,当诺言混合会引起混乱。 返回的承诺,而不是:
it('[MESSAGES-1] cannot be posted without an auth token', function() {
return agent.post(config.webRoot + '/rooms/ABC/messages').send({
content: 'This is a test!'
}).end().then(function(res) {
// here you must throw an error, because if the post didnt fail somehow, the test would be green because of no assertations and no promise rejection.
throw new Error("Not expected");
}, function(err) {
expect(err.status).toBe(401);
});
});
文章来源: Mocha tests using superagent + promises timeout rather than fail with 'expect'