2016-03-30 11 views
0

$resourceを使用するAngularJSサービスの単体テストを試みています。それを分離して保つために、$resourcequery()メソッドでJasmineのspyOnとスパイを使用したいと思います。私のコントローラでは、短い形式のquery()を使用して、$promise.then(success, error)を呼び出すことなく、成功とエラー関数を直接クエリメソッドに渡したいと考えています。これが可能ですか、または長い形式のquery().$promise.then(success, error)についていますか?ここで

は、私は私の問題を説明する失敗テストで作成したplunkerです:http://plnkr.co/edit/hVc2YNnwUDNv7IHODOMD?p=preview

私はSOの問題を解決するために主張しますが、すべては私が使用している部品の多くの古いバージョンを使用している上のいくつかの質問を発見しました。プランナーからAngular 1.5.2、Jasmine 2.4.1で作業しているのが分かります。

関連する質問として、多くのチュートリアルでは、コントローラに返り値query()を配列に割り当て、データがロードされると配列が更新されることを示しています。これは最もクリーンなソリューションですが、エラーが発生した場合はどうなりますか?私は、データの読み込みに問題がある場合は、いくつかのデフォルトのエラー通知か何も起こっていない状態に終わることが予想されます。インターセプタを介して他の場所でエラーを処理し、イベントを発生させ、一般的な非コントローラ固有の方法でユーザーに通知するのがベストプラクティスですか?私は、インターセプタは、いくつかの文脈を与えるためにユーザに表示するメッセージを決定する何らかの方法を必要とすると考えています。たとえば、「Bagelsの読み込みは通常より長くかかるようですが、ここをクリックして再試行します。ステータスコード '

答えて

1

あなたは引き続き関数を、クエリ(成功、エラー)として渡す場合、関数の省略形を使用することはできます。あなたは以下に示すように誤差関数を説明するために必要なユニットテストを修正するには:

spyOn(mockBagelApiService, 'query').and.callFake(function(callback1, callback2) { 
    queryDeferred.promise.then(callback1); 
    queryDeferred.promise.catch(callback2); 
    return {$promise: queryDeferred.promise} 
    }); 

callFakeは、あなたが成功すると、エラーのための2つの機能があるquery()に渡すパラメータになります。約束が解決されたか拒絶されたかに応じて、適切なコールバックでthenおよびcatchブロックを処理する必要があります。

角型アプリケーションでリクエストエラーを処理した方法は、catchブロックで呼び出されたエラーハンドラサービスを作成して特定のエラーメッセージを受け取り、モーダルをポップアップさせることです。メッセージを処理するには、USER_IS_NOT_AUTHOAUTH_ERRORなどの状況の説明を示す問題コードを返すようにサービスを設定して、エラーハンドラより具体的な応答を提供するために使用することができます。

関連する問題