0

angular アプリのコンポーネントをテストする必要があります。問題は、何かをテストするたびに、カルマ テストランナーがそのエラーを表示することです。

Error: Unexpected request: GET /foo
No more request expected

いくつかの調査の結果、テスト フレームワークがすべてのリクエストをブロックすることが明らかになりました。テストで受け入れられたすべてのリクエストを次の方法で宣言する必要があります。

beforeEach(inject(function ($httpBackend) {
    $httpBackend.expectGET("/foo").respond("bar");
}));

だから私はリクエストに期待することができます。

問題は、ここに示すように、 $httpBackend を初期化し、その後モジュール/アプリをロードできないように見えることです:

beforeEach(inject(function ($httpBackend) {
    $httpBackend.expectGET("/foo").respond("bar");
}));
beforeEach(module('myApplication'));

で失敗します

Error: Injector already created, can not register a module!

しかし、最初にモジュール/アプリをロードしてから $httpBackend を構成するには、手遅れです:

beforeEach(module('myApplication'));
beforeEach(inject(function ($httpBackend) {
    $httpBackend.expectGET("/foo").respond("bar");
}));

で失敗します

Error: Unexpected request: GET /foo
No more request expected

アプリケーション構成内で ajax リクエストを行う必要があるため、失敗しますmyapp.config(function(...) {.. doSomeAjax ..}

問題を解決する方法はありますか?

4

1 に答える 1

2

最初の問題について: 必要なモジュールを次のようにロードできます。

var $httpBackend; // reference for your it() functions
beforeEach(function () {
    module('myApplication');

    inject(function ($injector) {
        $httpBackend = $injector.get('$httpBackend');
    });
});

さて、angularjs httpBackend documentationからの予期しないリクエストの問題について:

本番環境で使用される $httpBackend は、常に非同期でリクエストに応答します。単体テストでこの動作を保持すると、非同期の単体テストを作成する必要があり、これは作成、追跡、保守が困難です。同時に、テスト中のコードの実行が変更されるため、テスト モックは同期的に応答できません。このため、モック $httpBackend には flush() メソッドがあり、テストが保留中のリクエストを明示的にフラッシュできるため、バックエンドの非同期 API を保持しながら、テストを同期的に実行できます。

私はあなたとは少し違う使い方をしているので、以下の私の解決策は単なる推測です. まず、模擬応答が必要だと思います。で定義しwhen()...respond()ます。次に、リクエストをフラッシュする必要があります。

$httpBackend.expectGET("/foo").respond("bar");
$httpBackend.flush();

これを使用して、工場で http 要求を行うサービスをテストしました。beforeEach 句では、最初にモック レスポンスを定義し、次にサービスをインスタンス化し (myservice = $injector('nameofservice')その後、ファクトリでトリガーされたリクエストをフラッシュしました。

于 2013-07-18T13:24:37.317 に答える