2016-04-05 1 views
1

ジャスミンを使用してコントローラをテストしようとしています。基本的に、コントローラが作成されると、http要求を行うためのサービスが呼び出されます。私は偽のデータを取得するためにhttpBackendを使用しています。テストを実行しようとすると、常に「フラッシュする要求がありません」というエラーが表示されます。 httpBackend.flush()を削除すると、controller.data.nameが定義されていないためテストが失敗します。それがどうして起こるのか誰にでも知ることができますか?ありがとう。ngMockE2EにhttpBackend flushを使用できません

モジュールのコードはここにある:

var myModule = angular.module('myModule', ['ngMockE2E']); 
myModule.run(function($httpBackend){ 
    $httpBackend.whenGET('/Person?content=Manager').respond(function(){ 
    var response = {'name':'Bob','age':'43'} 
    return [200,response]; 
    }) 
}); 

サービスのためのコード:

myModule.factory('myService',function($http){ 
    return { 
     getData: function(position){ 
      return $http.get('/Person?content='+position); 
     } 
    } 
}); 

コントローラのためのコードは次のとおり

myModule.controller('myController',function(xrefService){ 
    var _this = this; 
    _this.data ={}; 
    _this.getData = function(position){ 
     myService.getData(position).then(function(response){ 
      _this.data = response.data 
     }); 
    } 
    _this.getData("Manager"); 
}) 

テストするためのコードコントローラは:

describe("Test Controller",function(){ 
    var controller,httpBackend,createController; 
    beforeEach(module('myModule')); 
    beforeEach(inject(function($controller,$httpBackend){  
     createController = function(){ 
     return $controller('myController'); 
     } 
     httpBackend = $httpBackend;  
    })); 
    it("should return data",function(){ 
     controller = createController(); 
     httpBackend.flush(); 
     expect(controller.data.name).toEqual("Bob"); 
    });  
}) 

答えて

0

あなたはまた私が使用して助言する...次のようにテストコード内の$ httpBackendを使用しなければならない「モジュールのコード」内

it("should return data",function(){ 
    $httpBackend.expectGET('/Person?content=Manager').respond(function(){ 
     var response = {'name':'Bob','age':'43'} 
     return [200,response]; 
    }) 
    controller = createController(); 
    httpBackend.flush(); 
    expect(controller.data.name).toEqual("Bob"); 
});  

を$ httpBackend.whenGETを使用していますGETの代わりにGETを使用してください。

いつ、そのようにリクエストが行われたかどうかを確認しています。

あなたが言っているのは、リクエストが行われたときに、リクエストが行われたときにリクエストが行われたときにテストが失敗した場合です。

PSコントローラコードの中にいくつかのconsole.logステートメントを置くと、テストスイートを実行するときにこれらのログステートメントが表示されます。そうでなければ、コントローラコードがヒットしていないこともわかります。

も...期待が満たされなかった場合、テストの失敗を強制します

afterEach(function() { 
     httpBackend.verifyNoOutstandingExpectation(); 
     httpBackend.verifyNoOutstandingRequest(); 
}); 

を使用しています。

+1

ありがとうdanday74、それは今動作します。しかし、テストメソッドでexpectGET()、respond()を使用することを避けることができればとにかく思っています。それ以来、私はコントローラをテストするためにサービスコードを読む必要があります。例えば、おそらくcontroller.dataが空でないかどうかをテストしたいのです(バックエンドからデータを受け取ることを意味します)。 – Steven

+0

あなたは思考:)ええ、あなたはジャスミンスパイを使いたいと思っています。 http://ng-learn.org/2014/08/Testing_Promises_with_Jasmine_Provide_Spy – danday74

+0

spyOn(myService、 'getData')。および。callFake(function(){ var def = $ q.defer(); def.resolve(YOUR_MOCK_HTTP_RESPONSE); return def.promise; }); \t expect(myService.getData).toHaveBeenCalled(); – danday74

1

angular documentationはngMockE2Eのために$ httpbackendについては、次の言葉:

また、我々は手動で、我々は、ユニットテストの際に行うよう リクエストを嘲笑フラッシュする必要がありますする必要はありません。この理由から、e2e $ httpBackendは、嘲笑されたリクエストを自動的にフラッシュします.XMLHttpRequestオブジェクトの動作をシミュレートします。

したがって、短い答え:それは存在しないため、あなたはそれを必要としません。

関連する問題