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

使用Node.js中的http.get库对vows进行异步测试,http,node.js,vows,Http,Node.js,Vows,我花了很长时间试图获得一个基本的http测试来处理誓言 我想我已经遵循了vows中的异步示例,并替换了相应的调用,但我肯定遗漏了一些东西 测试代码如下所示: var http = require('http'), vows = require('vows'), assert = require('assert'); vows.describe("homepage").addBatch({ "Get the home page": { topic: function(

我花了很长时间试图获得一个基本的http测试来处理誓言

我想我已经遵循了vows中的异步示例,并替换了相应的调用,但我肯定遗漏了一些东西

测试代码如下所示:

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)
/Users//node\u modules/vows/lib/vows.js:80
错误',{type:'promise',错误:err.stack | | | err.message | | | JSON.stringify(
^
TypeError:将循环结构转换为JSON
at Object.stringify(本机)
在EventEmitter上。(/Users//node_modules/vows/lib/vows.js:80:90)
在EventEmitter.emit(events.js:64:17)
在/Users//node_modules/vows/lib/vows/context.js:31:52
在ClientRequest上。(/Users//node_modules/vows/lib/vows/context.js:46:29)
在ClientRequest.g(events.js:143:14)
在ClientRequest.emit(events.js:64:17)
在HTTPParser.onIncoming(http.js:1349:9)
在HTTPParser.onHeadersComplete(http.js:108:31)
在Socket.ondata(http.js:1226:22)
我可以得到一个简单的http示例来自己工作。我可以得到誓言示例来自己工作,但无论出于什么原因,我不能将它们结合起来。我真的非常感谢这里的帮助。我已经尝试让它工作了一段时间(包括谷歌搜索)

更新:

显然,在回调中添加一个错误参数可以解决这个问题,多亏了Alexis Sellier(誓言的创建者)的帮助

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


我的新问题是,为什么在vows中使用http库时需要错误参数?

在检查了vow的源代码后,我想我知道了原因。vows始终确保在调用this.callback时,结果接收方函数的第一个参数始终是错误对象。vows根据以下规则解释回调:

  • 如果原始回调的第一个参数是布尔值,则使用该参数确定是否将错误对象附加到接收回调(例如,
    path.exists(布尔值)
    将发出
    callback(error,exists)

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

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

    请不要把我的回答当作福音,因为这是我自己的经验。另一个问题是,当你想要测试的函数中有异步操作时——除非你提供回调,否则vows将无法正确处理它

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


    我的建议?在处理异步代码时,请使用。不要让誓言控制您的流程。

    文档中实际上缺少这一点,这一点仍然有点短。但您可以在以下内容中看到它:


    正如Morten Siebuhr和Ruben Tan所说,这就是vows的工作原理,这就是为什么它会这样工作。

    有趣的是,我正在使用http库中内置的node.js,我想他们已经改变了错误优先约定,或者至少允许使用.on()约定使用单独的错误处理函数。
    'when peeled *asynchronously*': {
            topic: function (banana) {
                banana.peel(this.callback);
            },
            'results in a `PeeledBanana`': function (err, result) {
                assert.instanceOf (result, PeeledBanana);
            }
        }