我正在尝试使用Mocha为我正在处理的Node.js API编写测试。我正在编写的当前测试只对查看响应是否返回正确的状态代码感兴趣 - 他们不关心响应主体。
因此,我写了以下测试:
注意,这不是真正的考验。我已经删除了项目特定的东西。错误 仍会出现在以下代码中。
var http = require('http');
var assert = require("assert");
before(function() {
var server = http.createServer(function(req, res) {
res.end();
}).listen(8080);
});
describe("Convenience Functions", function() {
it("should return a 200 status code", function(done) {
http.get("http://localhost:8080", function(res) {
assert.equal(res.statusCode, 200);
res.on('end', function() {
done();
});
});
});
});
但是,运行该测试会让我从Mocha暂停。 Mocha默认为2000ms超时,但我可以将其更改为任何不必要的高数字,它仍然会超时。
我已经和他斗争了好几个小时,终于找到了“修复”。如果我将测试更改为:
describe("Convenience Functions", function() {
it("should return a 200 status code", function(done) {
http.get("http://localhost:8080", function(res) {
assert.equal(res.statusCode, 200);
res.on('data', function() { })
res.on('end', function() {
done();
});
});
});
});
测试不再超时。您会注意到这两个测试之间仅的区别在于第二个版本正在处理响应上的data
事件。它对数据没有任何作用,它只是定义了一个监听器。现在我的测试通过了绚丽的色彩。
这是一个足够简单的修复方法,但我很困惑为什么我需要这样做。我打电话给done()
后,mocha测试是否应该立即完成?
答案 0 :(得分:2)
http.get("http://localhost:8080", function(res) {
assert.equal(res.statusCode, 200);
done();
});
这就是你所需要的一切。数据/结束事件仅在响应具有正文时才有用,但它不会,并且在任何情况下您都不关心,所以只需调用done()
并忽略响应,而不是检查它的状态代码。
一旦调用done(),mocha测试是否应该立即完成?
是的,他们确实这样做了。您的第一个代码段中的问题是end
事件永远不会触发,因此您实际上并未调用done()
。