我在尝试获得基本的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例子来自己处理。我可以单独使用誓言示例,但是出于任何原因我都无法将它们组合在一起。非常感谢您的帮助。我一直在尝试使它工作一段时间(包括大量的谷歌搜索)。

更新:

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

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

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

最佳答案

检查誓言的源代码后,我想我知道为什么。誓言始终确保您在调用this.callback时,所得接收器函数的第一个参数始终是错误对象。誓言通过以下规则解释回调:

  • 如果原始回调的第一个参数是 bool 值,则可使用该参数来确定是否将错误对象附加到接收的回调中(例如path.exists(boolean)将发出callback(error, exists)代替)
  • 如果第一个参数是一个对象,则假定它是一个错误对象,并使用该对象确定是将原始回调添加到“错误”列表还是“成功”列表中。该列表存在的原因是为了支持基于 promise 的测试。

  • 虽然我无法确定上述说法是正确的,但我的经验是,誓言的异步样式是为了支持 Node 样式的回调(例如,以err作为第一个arg),而不符合此标准的第三方npm模块将很难测试。

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

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

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

    10-08 15:36