0

を使用する AngularJS サービスを単体テストしようとしています$resource$resourceそれを分離しておくために、Jasmine の spyOn と spyのメソッドを使用したいと思いquery()ます。query()私のコントローラーでは、を呼び出さずに、成功関数とエラー関数をクエリ メソッドに直接渡す短い形式を使用できるようにしたいと考えています$promise.then(success, error)。これは可能ですか、それとも長い形式で立ち往生していquery().$promise.then(success, error)ますか?

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

問題を解決すると主張する SO に関するいくつかの質問を見つけましたが、すべて私が使用しているコンポーネントのはるかに古いバージョンを使用しています。plunker から、Angular 1.5.2 と Jasmine 2.4.1 で作業していることがわかります。

関連する質問として、多くのチュートリアルでは、コントローラーで戻り値をquery()配列に割り当てることができ、データが読み込まれると配列が更新されることが示されています。これは最もクリーンなソリューションですが、エラーが発生した場合はどうなるでしょうか? データの読み込みに問題がある場合は、デフォルトのエラー通知が表示されるか、何も起こらないと思います。インターセプターを介して他の場所でエラーを処理し、イベントを発生させて、一般的な非コントローラー固有の方法でユーザーに通知することをお勧めしますか? その場合、インターセプターは、「一部のリクエストが 500 を返した」ではなく、「ベーグルの読み込みに通常より時間がかかっているようです。ここをクリックして再試行してください」など、コンテキストを提供するためにユーザーに表示するメッセージを決定する何らかの方法が必要になると思います。ステータスコード」

4

1 に答える 1

1

関数を query(success, error) として渡す場所では、関数の短縮形を引き続き使用できるはずです。単体テストを修正するには、以下に示すようにエラー関数を考慮する必要があります。

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

callFakequery()は、成功とエラーのための 2 つの関数である、渡されたパラメーターを受け取ります。promise が解決されたか拒否されたかに応じて、適切なコールバックで then ブロックと catch ブロックを処理する必要があります。

angular アプリでリクエスト エラーを処理する方法は、catch ブロックで呼び出され、特定のエラー メッセージを受け取ってモーダルをポップアップするエラー ハンドラー サービスを作成することです。必要に応じて構成できます。リロードやリダイレクトなどのモーダル ボタンを定義できます。メッセージを処理するために、エラー ハンドラが使用できる、USER_IS_NOT_AUTHまたはOAUTH_ERRORエラー ハンドラが使用できる状況の説明を提供する問題コードを返すようにサービスを構成できます。より具体的な回答を提供します。

于 2016-03-30T03:20:53.080 に答える