3

私は、基本的な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の例をそれ自体で書き出す場合、エラー引数は必要ありません。なぜそれが必要なのかを示す誓いの文書が見つからないので、少し途方に暮れています。

私の新しい質問は、誓いの中でhttp libを使用するときにエラー引数が必要なのはなぜですか?

4

2 に答える 2

4

誓いのソースコードをチェックした後、私はその理由を知っていると思います。誓いは、あなたが呼び出すときthis.callback、結果として生じるレシーバー関数の最初の引数が常にエラーオブジェクトであることを常に保証します。誓いは、これらのルールによってコールバックを解釈します。

  1. 発信元のコールバックの最初の引数がブール値である場合は、それを使用して、受信側のコールバックにエラーオブジェクトを追加するかどうかを決定します(たとえば、代わりpath.exists(boolean)に発行callback(error, exists)します)

  2. 最初の引数がオブジェクトの場合、それがエラーオブジェクトであると想定し、それを使用して、元のコールバックを「エラー」リストと「成功」リストのどちらに追加するかを決定します。このリストが存在する理由は、私が推測するプロミスベースのテストをサポートするためですか?

上記が正しいことを確認することはできませんが、私の経験では、vowsの非同期スタイルはノードスタイルのコールバック(たとえば、最初の引数としてのerr)をサポートするように作成されており、この標準に準拠していないサードパーティのnpmモジュールはテストするのは難しいです。

これは私自身の経験なので、私の答えを福音として受け取らないでください。もう1つの落とし穴は、テストする関数内に非同期操作がある場合です。コールバックを提供しない限り、vowsはそれを適切に処理できません。

個人的には、誓いはまだ非同期コードをテストするのを難しくしていると思います。フロー制御機能がwaitFor()あればいいのにと思います。until()

私のおすすめ?非同期コードを扱うときは、ステップを使用します。誓いにあなたの流れをコントロールさせないでください。

于 2011-06-16T08:26:44.407 に答える
1

それは実際にはまだ少し短いドキュメントにありません。しかし、あなたはこのページでそれを垣間見ることができます:

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

MortenSiebuhrとRubenTanが言ったように、これが誓いの仕組みであり、それがそのように機能する理由です。

于 2011-08-10T16:15:28.490 に答える