簡體   English   中英

使用 Node.js 中的 http.get 庫對誓言進行異步測試

[英]Async testing with vows using the http.get library in Node.js

我有一段時間試圖獲得一個基本的 http 測試來處理誓言。

我想我已經遵循了vows 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 示例時,不需要錯誤參數。 我在誓言中找不到任何文件來說明為什么需要它,所以我有點茫然。

我的新問題是為什么在誓言中使用 http 庫時需要錯誤參數?

在檢查了 vow 的源代碼后,我想我知道為什么了。 Vows 始終確保當您調用this.callback時,生成的接收器函數的第一個參數始終是錯誤 object。 Vows 通過以下規則解釋回調:

  1. 如果您的原始回調的第一個參數是 boolean,則使用它來確定是否給 append 一個錯誤 object 到接收回調(例如path.exists(boolean)將發出callback(error, exists)布爾值)

  2. 如果第一個參數是 object,假設它是一個錯誤 object,並使用它來確定是將原始回調添加到“錯誤”還是“成功”列表。 我猜這個列表存在的原因是為了支持基於 promise 的測試?

雖然我無法確認上述內容是否正確,但我的經驗是 vows 的異步樣式是為了支持節點樣式的回調(例如 err 作為第一個參數),不符合此標准的第 3 方 npm 模塊將很難測試。

請不要把我的回答當成福音,因為這是我自己的經歷。 另一個問題是當您在要測試的 function 中進行異步操作時 - 除非您提供回調,否則 vows 將無法正確處理它。

就個人而言,我認為誓言仍然使測試異步代碼變得困難。 我希望它有一些waitFor()until()流控制功能。

我的建議? 處理異步代碼時,請使用Step 不要讓誓言控制你的心流。

它實際上在文檔中缺失,仍然有點短。 但是您可以在此頁面中看到它:

'when peeled *asynchronously*': {
        topic: function (banana) {
            banana.peel(this.callback);
        },
        'results in a `PeeledBanana`': function (err, result) {
            assert.instanceOf (result, PeeledBanana);
        }
    }

正如 Morten Siebuhr 和 Ruben Tan 所說,這就是誓言的運作方式,也是它如此運作的原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM