使用 Node.js 中的 http.get 库进行异步测试

2023-11-30

我正在努力尝试进行基本的 http 测试来处理誓言。

我想我已经遵循了誓言中的异步示例http://vowsjs.org/#-writing-asynchronous-tests并替换适当的电话,但我一定错过了一些东西。

测试代码如下所示:

var http = require('http'),
    vows = require('vows'),
    assert = require('assert');

vows.describe("homepage").addBatch({
  "Get the home page": {
    topic: function() {
      http.get({'host': "127.0.0.1", 'port': 5000, 'path': '/'}, this.callback);
    },
    'should respond with 200 OK': function(res) {
      assert.equal(res.statusCode, 200);
    }
  }
}).export(module);

当我尝试为此运行测试时,出现以下错误:

/Users/<home_folder>/node_modules/vows/lib/vows.js:80
rrored', { type: 'promise', error: err.stack || err.message || JSON.stringify(
                                                                    ^
TypeError: Converting circular structure to JSON
    at Object.stringify (native)
    at EventEmitter.<anonymous> (/Users/<home_folder>/node_modules/vows/lib/vows.js:80:90)
    at EventEmitter.emit (events.js:64:17)
    at /Users/<home_folder>/node_modules/vows/lib/vows/context.js:31:52
    at ClientRequest.<anonymous> (/Users/<home_folder>/node_modules/vows/lib/vows/context.js:46:29)
    at ClientRequest.g (events.js:143:14)
    at ClientRequest.emit (events.js:64:17)
    at HTTPParser.onIncoming (http.js:1349:9)
    at HTTPParser.onHeadersComplete (http.js:108:31)
    at Socket.ondata (http.js:1226:22)

我可以得到一个简单的 http 示例来独立工作。我可以让誓言示例单独工作,但无论出于何种原因我都无法将它们结合起来。我真的很感激这里的一些帮助。我已经尝试让它工作一段时间了(包括大量谷歌搜索)。

UPDATE:

显然,在回调中添加错误参数可以解决这个问题,这要归功于 Alexis Sellier(誓言的创建者)的帮助。

但我不知道为什么。当自己编写 http lib 示例时,不需要错误参数。我在誓言中找不到任何文档来说明为什么需要它,所以我有点不知所措。

我的新问题是为什么在誓言中使用 http lib 时需要 error 参数?


在检查了誓言的源代码之后,我想我知道为什么了。誓言始终确保当您致电时this.callback,生成的接收器函数的第一个参数始终是错误对象。 Vows 按以下规则解释回调:

  1. 如果原始回调的第一个参数是布尔值,请使用它来确定是否将错误对象附加到接收回调(例如path.exists(boolean)会发出callback(error, exists)反而)

  2. 如果第一个参数是一个对象,则假设它是一个错误对象,并使用它来确定是否将原始回调添加到“错误”或“成功”列表中。我猜这个列表存在的原因是为了支持基于承诺的测试?

虽然我无法确认上述内容是否正确,但我的经验是,Vows 的异步样式是为了支持节点样式的回调(例如 err 作为第一个参数),并且不符合此标准的第 3 方 npm 模块将很难测试。

请不要把我的回答当成福音,因为这是我自己的经历。另一个问题是当您想要测试的函数内部有异步操作时 - 除非您提供回调,否则誓言将无法正确处理它。

就我个人而言,我认为誓言仍然使测试异步代码变得困难。我希望它有一些waitFor() or until()虽然有流量控制功能。

我的建议?处理异步代码时,使用Step。不要让誓言控制你的心流。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Node.js 中的 http.get 库进行异步测试 的相关文章

随机推荐