web-dev-qa-db-ja.com

$ httpBackendのモック-「予期しないリクエスト、これ以上のリクエストは期待できません」の処理方法

次のようにコード化されたジャスミンテストがあります。

  it ("should send correct message to server to get data, and correctly set up scope when receiving it", function(){
    $httpBackend.when('GET', 'https://localhost:44300/api/projectconfiguration/12').respond(fakedDtoBase);
    $routeParams.projectId=fakeId; // user asks for editing project
    scope.$apply(function(){
        var controller=controllerToTest(); // so controller gets data when it is created
    });
    expect(scope.projectData).toEqual(fakedDtoBase);
});

動作しますが、エラーが発生します:

Error: Unexpected request: GET views/core/main/main.html
No more request expected
    at $httpBackend (C:/SVN/src/ClientApp/client/bower_components/angular-mocks/angular-mocks.js:1207:9)
    at sendReq (C:/SVN/src/ClientApp/client/bower_components/angular/angular.js:7800:9)
    at $http.serverRequest (C:/SVN/src/ClientApp/client/bower_components/angular/angular.js:7534:16)
    (more stack trace)....

私は他のすべての呼び出しをモックできることに気付いています。しかし、他のいくつかのことを呼び出す可能性があるため、テストが他に何をロードしたいかは気にしないとしましょう。他のすべてのリクエストが「黙って」行われ、他のすべてのリクエストに対して単一のダミー応答が提供されるようにする方法を教えてください。

33
Askar Ibragimov

指定していないリクエストが行われたため、テストは失敗します。

追加してみてください:

$httpBackend.when('GET', 'views/core/main/main.html').respond(fakedMainResponse);

もちろん、fakedMainResponseも定義する必要があります。

documentation (セクションRequest Expectations vs Backend Definitions)もご覧ください:

要求の期待は、アプリケーションによって行われた要求についてアサーションを作成し、それらの要求に対する応答を定義する方法を提供します。 予想されるリクエストが行われない場合、またはリクエストが間違った順序で行われた場合、テストは失敗します。

$httpBackend.whenの2番目のパラメーターは、実際にはRegExpです。したがって、他のすべての要求に一致するRegExpを指定すると、機能するはずです。

47
PrimosK

EndToEndテストでhttp呼び出しをモックするためにhttpBackendを使用している場合、またはアプリケーションのhttp呼び出し全体をモックする場合は、次のコードをアプリ構成セクションに追加します(テンプレートの場所に応じて正規表現を変更します):

$httpBackend.whenGET(/^\/templates\//).passThrough();

リファレンス: https://docs.angularjs.org/api/ngMockE2E/service/ $ httpBackend

Ui-routerの統合中に同様の問題を修正するために、angularjs 1.4でテスト済み

15
le0diaz

$digest()がある場合、次のように$digestに従う必要があることに注意することも重要だと思います。

_$rootScope_.$digest();
$httpBackend.when('GET', 'views/core/main/main.html').respond(fakedMainResponse);
// ...
$httpBackend.flush(); // And remember to flush at the end
0
ecoologic