gpt4 book ai didi

javascript - Mocha 要求我读取 HTTP 请求正文

转载 作者:行者123 更新时间:2023-12-02 18:23:19 25 4
gpt4 key购买 nike

我正在尝试使用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() 后立即完成吗?

最佳答案

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

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

Shouldn't mocha tests just finish as soon as I call done()?

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

关于javascript - Mocha 要求我读取 HTTP 请求正文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18616329/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com