[英]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 通過以下規則解釋回調:
如果您的原始回調的第一個參數是 boolean,則使用它來確定是否給 append 一個錯誤 object 到接收回調(例如path.exists(boolean)
將發出callback(error, exists)
布爾值)
如果第一個參數是 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.