我正在尝试使用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 默认设置为 2000 毫秒超时,但我可以将其更改为任何不必要的高数字,它仍然会超时。
我已经为此奋斗了几个小时,终于找到了一个“修复”。如果我将测试更改为:
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
响应中的事件。它不对数据做任何事情,它只是在其上定义了一个监听器。现在我的测试以优异的成绩通过。
这是一个很容易解决的问题,但我很困惑为什么我需要这样做。mocha 测试不应该在我打电话后立即完成done()
吗?