0

誓いを使ってBDDでnode.jsプロジェクトを開始しようとしています。次に、この奇妙なエラーが発生しました。

私は誓いを立てて急行のための小さなルートテストを書こうとしていました、そしてこれが私の元のコードです、

node_server.prototype.mainpage = function(callback) {
  http.get({host:'localhost', port:this.port, path:'/', agent:false}, function(res){
  callback(res.statusCode);
  });
}

そして、これが私の誓いのテストの書き方です

vows.describe('Request to the server').addBatch({
'Should get http 200': {
      topic: function () {
        app_server.mainpage(this.callback)
      },

      'we get 200': function (statusCode) {
        app_server.close_server();
        assert.equal(statusCode, 200);
      }
  },
}).run(); // Run it

このようにstatusCodeが正しい場合でも、Vowsは常に予期しないエラーを報告します

» An unexpected error was caught: 200

だから私はこのようにメインページの機能を変更します

node_server.prototype.mainpage = function(callback) {
  http.get({host:'localhost', port:this.port, path:'/', agent:false}, function(res){
      callback("error", res.statusCode); // Here I added a err message in front of the status code.
  });
}

また、テストスイートを次のように変更します

'we get 200': function (err, statusCode) {

その後、このテストは機能しました!この奇妙な状況がどうして起こったのだろうかと思っています。誓いのドキュメントを読みましたが、cbに1つではなく2つのパラメーターを設定する必要があると言われている場所は見つかりませんでした。

手がかりをください!前もって感謝します!

4

1 に答える 1

1

Vowsのドキュメントには記載されていませんが、Node.jsコミュニティで広く採用されているエラーファーストコールバックパターンを想定しています。このパターンでは、コールバックの最初のパラメーターは常にエラーです。nullまたは未定義の場合は、非同期操作が成功したことがわかります。関数がエラーパラメータを生成しない場合でも、このパターンをすべてのコードに使用することをお勧めします。

このパターンを自分で使用すると、asyncなどの他のライブラリをより簡単に利用できるようになります。これにより、複雑なアプリの処理がはるかに簡単になります。

于 2012-11-17T02:53:15.247 に答える