2017-06-13 10 views
2

で要求に失敗しました。私はテスト実行のためのモカとスタブのためのサイロンを使用しています。私はonメソッドが呼び出された回数を数えることができるようにリクエストをスタブすることができますが、プロミスを含むことは決して解決しません。テストは、私は次のようないくつかのコードを持っているノード

約束事を処理するためにsinonで動作するパッケージがいくつかありますが(私はsinon-as-promisedとsinon-stub-promiseを試しました)、正しく解決するにはdoThingメソッド全体をスタブする必要があります。私は、このコードをテストするためのプロッパー方法や、テストが簡単な代替コード構造の入力を感謝します。

問題のテストでは、(それがdoThingを返すように約束を待ってハング)以下である:

context('when the server is unavailable', function(){ 
    beforeEach(function() { 
    var onStub = sinon.stub(); 
    requestStub = {post: function(){ return {on: onStub}}}; 
    Service = proxyquire('path/to/service', {request: requestStub}); 
    service = new Service(); 
    }); 

    it('should not set the auth key', function(){ 
    return service.doThing().then(function(x){ 
     return assert(onStub.calledOnce); 
    }); 
    }); 
}); 

ありがとう!

+1

モジュールコードのコメントです。 'resolve'関数でステータス値を返す代わりに、何かがうまくいかないときに' reject'メソッドを実行してください。ほとんどの場合、より理にかなっています:-) – oligofren

+0

私の答えはあなたを助けましたか?レスポンス、upvote、または割り当てられた答え... – oligofren

+1

それは私の全体的な知識を広げたという点で私を助けましたが、実際には私が持っていた問題を解決した同僚でした。私は自分自身で答えを書く前に、彼に応答する機会を与えています。 – biagidp

答えて

1

明白なことをまとめると、ここではrequestオブジェクトを制御しないか、むしろpostメソッドの応答を制御しないということです。あなたがコントロールすることができるなら、doThingメソッドの異なるコードパスをすべてテストすることができます。

あなたはrequestからの応答を制御するための3つの可能性があります。

  1. スタブ(Nockのようなものを使用して)ネットワーク層アウトをあなたはHTTP層がrequestライブラリに引き渡しているかを制御することができます。 (コードの変更が必要になります)request.postの代わりに使用することができるスタブを注入する
  2. 使用依存性注入
  3. ことにリンクシームを使用したオブジェクトは、あなたがコントロールするスタブオブジェクトをrequire()の呼び出しから返された代用します。もちろんこれはあなたがしたことです。

個人的には、余分なフレームワークを必要とせず、推論しやすく、実装が簡単なため、オプション2になってしまいます。 this quite elaborate exampleを参照できますが、必要なコードは最小限です。

とにかく、オプション3を選択したので、私はそのルートをダウンするかもしれません:-)問題はあなたがpostメソッドをどのようにスタブアウトしたかです。それはあなたのコールバックを呼び出すことがありますか?私はこのような何かにpostスタブを変更します

:もちろん

post: (url, options, cb) => { 
    cb(null, null, null); // will resolve your promise in the module 
    return { on: onStub }; 
} 

後で上の値で何かをする必要があるはずです、あなたのコールバックに渡さnull sが何か他のものすることができます。

関連する問題