0

我正在尝试使用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()吗?

4

1 回答 1

2
   http.get("http://localhost:8080", function(res) {
      assert.equal(res.statusCode, 200);
      done();
   });

这就是你所需要的。数据/结束事件只有在响应有正文时才有用,但它没有,而且在任何情况下你都不关心,所以只需调用done()并忽略响应,而不是检查它的状态代码。

摩卡测试不应该在我调用 done() 后立即完成吗?

是的,他们确实做到了。您的第一个片段中的问题是end事件永远不会触发,因此您实际上不会调用done().

于 2013-09-04T14:56:26.943 回答