2014-09-22 4 views
4

각도와 재스민 조합을 사용하여 컨트롤러를 테스트하고 약속 된 약속 사용에 대해 확실하지 않습니다.약속 된 약속을 지닌 각도/재스민 테스트

이것은 제 사양 코드입니다.

describe('Controller Tests', function(){ 
    var scope, searchAPI; 

    beforeEach(function(){ 
     var mockSearchAPI = {}; 
     module('myApp', function($provide){ 
      $provide.value('searchAPI', mockSearchAPI); 
     }); 
    }); 

    inject(function($q){ 
     var testData = {"message":"hi"}; 
     mockSearchAPI.executeSearch = function(){ 
      var defer = $q.defer(); 
      defer.resolve(testData); 
      return defer.promise; 
     }; 
    }); 

    beforeEach('Main Search Controller Tests', function(){ 

     function($controller, $rootScope, _searchAPI_){ 
      scope = $rootScope.$new(); 
      searchAPI = _searchAPI_; 
      $controller('MainSearchCtrl', function(){ 
       $scope: scope, 
       searchAPI: searchAPI 
      }); 
      scope.$digest(); 
     } 
    }); 

    it('should return a promise correctly', function(){ 
     var field = "testfield"; 
     var value = "testvalue"; 
     var pageNumber = 1; 
     var promise = scope.processQueryByField(field, value, pageNumber); 

     //THIS LINE IS GIVING ME '{}' 
     alert(promise); 
    }); 

}); 

내가 "경고하는"줄에서 왜 '{}'의 출력을 얻는 지 확신 할 수 없습니다. inject 함수에서 "testData"로 정의한 데이터 구조체 여야하지 않습니까? 나는 여기서 무슨 일이 일어나고 있는지 확신하지 못한다. 나는 수많은 해결책을 시도했다.

내 컨트롤러 코드는 기본적으로 내가 인젝터 코드 내부에 정의 된 값을 수신

$scope.processQueryByField = function(field, value, pageNumber){ 
    return searchAPI.executeSearch(field, value, pageNumber); 
} 

난 그냥 있어야하지 않나요 서비스에 대한 래퍼입니다?

+0

'searchAPI.executeSearch'는 약속 권리를 반환? 그래서 궁극적으로'processQueryByField'는 데이터가 아닌 약속을 반환합니다. 그렇다면 설정하려는 기대치는 무엇입니까? 더 많은 것은'$ rootScope'를 잡아두고 expecation을 설정하기 전에 함수가 호출 된 후에 다이제스트를 적용해야합니다. – PSL

+0

그냥 모의이 올바르게 설정되어 있는지 (즉, 약속을 되 돌리는 지) 확인하고 더 복잡한 테스트를 할 수 있는지 확인하고 싶습니다. 기대를 설정하기 전에 $ rootScope를 얻고 다이제스트를 적용하면 무엇을 의미합니까? – Zack

+0

'은 (함수 "검색을 호출해야'() { spyOn (mockSearchAPI 'executeSearch'); VAR 필드 ="testfield "; VAR 값 ="testvalue "; VAR의 PAGENUMBER = 1; 범위. processQueryByField (필드, 값, PAGENUMBER) 은 (mockSearchAPI.executeSearch) .toHaveBeenCalled()을 예상, 예상 (mockSearchAPI.executeSearch) .toHaveBeenCalledWith (필드, 값, PAGENUMBER) });' – PSL

답변

3

약속 개체를 설정할 때 기대하고있는 것이 확실하지 않습니다. 약속이 해결되었는지 테스트 할 필요가 없습니다. 에 대한 결과를 테스트해야합니다. 약속이 해결되면.

예 : -

단순화하기 위해 모의를 변경

: - 내가 데이터로 해석 컨트롤러에 또 하나의 방법을 추가했습니다 그냥 데모

inject(function($q){ 
    var testData = {"message":"hi"}; 
    mockSearchAPI.executeSearch = function(){ 
     return $q.when(testData); 
    }; 
}); 

: -

.controller('MainSearchCtrl', ['$scope','searchAPI', function ($scope, searchAPI) { 
     //At this point placing this method on scope is useless 
     $scope.processQueryByField = function(field, value, pageNumber){ 
      return searchAPI.executeSearch(field, value, pageNumber); 
     } 
     //This when invoked will update the searchResults in the model. 
     $scope.populateData = function(){ 
      $scope.processQueryByField(1,1,1).then(function(data){ 
      $scope.searchResults = data; 
      }) 
     } 
    }]); 

Expectation # 1 : - 메소드가 호출 될 때 예상되는 인수로 API 메소드가 호출되는지 여부를 테스트합니다.

it('should invoke execute search', function(){ 
    //Set up a spy on your mock api method 
     spyOn(mockSearchAPI,'executeSearch'); 
     var field = "testfield"; 
     var value = "testvalue"; 
     var pageNumber = 1; 
     scope.processQueryByField(field, value, pageNumber); //invoke scope method with args 
     //Test if the mock api method has been called 
     expect(mockSearchAPI.executeSearch).toHaveBeenCalled();   
     //test if it has been called with expected arguments. 
     expect(mockSearchAPI.executeSearch).toHaveBeenCalledWith(field, value, pageNumber); 
    }); 

예상 2 : - 약속이 해결되면 데이터가 제대로 채워 졌는지 테스트합니다.

it('should return a promise correctly', function(){ 
    var field = "testfield"; 
    var value = "testvalue"; 
    var pageNumber = 1; 

    var promise = scope.processQueryByField(field, value, pageNumber); 
    //This is a useless expectation 
    expect(promise).toBeDefined(); 


    scope.populateData(); 
    $rootScope.$digest(); //<-- Apply digest cycle, so the promise is resolved 
    expect(scope.searchResults).toBeDefined(); 
    expect(scope.searchResults.message).toEqual("hi"); 
}); 

Test Demo

+0

고마워, 나는 이것이 나를 올바른 방향으로 보낼 것이라고 확신한다. 여분의 노력을 위해 – Zack

+1

@PSL + 1. 당신의 대답을 정말 많이 배우고 있습니다. 고맙습니다. – alecxe

+1

@PSL 익숙해 져야합니다.나는 자주 "인기가없는 태그"로 대답하고 있으며 때로는 OP가 사라진 후에도 받아 들여지지 않는 대답에 30 분 이상을 보냅니다. 그리고 아무 전망도, upvotes가 없다. 그것은 여기에있는 것이지만, 우리는 항상 좋은 운동을하고 경험을 쌓습니다. 이것은 포인트보다 훨씬 중요합니다. – alecxe