2016-04-07 7 views
2

私はJasmineとKarmaでBDDを学んでいます。John Papaのコントローラがデータサービスを呼び出すのを確認する

私はJohn Papa's style guideに従っていますが、私のコードをテストするのにはいくつかの困難があります。

describe("avengers controller", function() { 

    var controller, avengers; 

    beforeEach(function() { 
     module('app'); 
    }); 

    beforeEach(inject(function(_$rootScope_, _$controller_, _$q_, _dataservice_) { 
     dataserviceMock = _dataservice_; 
     controller = _$controller_; 
     vm = controller("AvengerController", { dataservice: dataserviceMock }); 
     $q = _$q_; 
     rootScope = _$rootScope_; 
     avengers = [{"id": 1}, {"id": 2}]; 
    })); 

    it('should be created successfully', function() { 
     expect(vm).toBeDefined(); 
    }); 

    it('should have called `dataservice.getAvengers`', function() { 
     spyOn(dataserviceMock, 'getAvengers').and.callFake(function(){ 
      var deferred = $q.defer(); 
      return deferred.promise; 
     }); 
     vm.getAvengers(); 
     expect(dataserviceMock.getAvengers).toHaveBeenCalledTimes(1); 
    }); 

    // What I'm trying to test 
    // Test 1 
    it('should have Avengers', function() { 
     spyOn(dataserviceMock, 'getAvengers').and.callFake(function(){ 
      var deferred = $q.defer(); 
      deferred.resolve([{"id": 1}, {"id": 2}]); 
      return deferred.promise; 
     ); 
     vm.getAvengers(); 
     expect(vm.avengers.length).toEqual(avengers.length); 
    }); 
    // Test 2 
    it('should have Avengers', function() { 
     spyOn(dataserviceMock, 'getAvengers').and.returnValue(avengers); 
     vm.getAvengers(); 
     expect(vm.avengers.length).toEqual(avengers.length); 
    }); 
}); 
:私はこれらのテストを行った

function dataservice($http) { 
    return { 
     getAvengers: getAvengers 
    }; 

    function getAvengers() { 
     return $http.get('/api/maa') 
      .then(getAvengersComplete) 
      .catch(getAvengersFailed); 

     function getAvengersComplete(response) { 
      return response.data.results; 
     } 

     function getAvengersFailed(error) { 
      // Fail 
     } 
    } 
} 

:この工場では

function getAvengers() { 
    return dataservice.getAvengers() 
     .then(function(data) { 
      vm.avengers = data; 
      return vm.avengers; 
     }); 
} 

私は(ジョン・パパのガイドから)コントローラ機能のこの種をテストしたいです

私は2つの異なる方法を試みましたが、うまくいかなかったため、そのテスト方法を理解できませんでした。avengerController.getAvengers()def戻り値のデータと等しいines vm.avengersは工場呼び出しからの恩人です。

+0

作業していないものを詳しく教えてください。それは約束のためにテストが 'アベンジャーズを持つべきか? – war1oc

+0

テスト1は "expected 0 to equal 2"を返し、テスト2は "undefinedはコンストラクタではありません(dataservice.getAvengers()、then(getAvengersComplete) ')")を返します。 –

答えて

1

私は解決策を見つけた:

it("should have avengers", function() { 
      deferred = $q.defer(); 
      spyOn(dataserviceMock, 'getAvengers').and.returnValue(deferred.promise); 
      deferred.resolve(customers); 
      vm.getAvengers(); 
      expect(dataserviceMock.getAvengers).toHaveBeenCalled(); 
      scope.$digest(); 
      expect(vm.avengers).toBeDefined(); 
      expect(vm.avengers).toEqual(avengers); 
     }); 

私は約束を返し、スコープを使用していた$ダイジェスト()hereがmentionnedとしてスコープのライフサイクルをシミュレートします。

関連する問題