2014-11-11 6 views
1

서비스에 대한 종속성이있는 각도 컨트롤러를 테스트하려고하는데 서비스 메서드가 약속을 반환합니다. 나는 서비스를 조롱하는 재스민 스파이 객체를 만들고 약속을 되 돌리는 메소드를 만들고있다. 그러나 어떤 이유로 내 모의 약속이 해결 된 결과를 반환하지 않습니다.약속을 반환하는 서비스를 호출하는 각도 컨트롤러

여기 내 컨트롤러 및 서비스 코드입니다. 여기

(function(){ 
'use strict'; 
angular 
    .module("supportPortal",[]) 
    .service('TipsService' ,['$http' ,TipsService]) 
    .controller('TipsCtrl', [ 'TipsService', TipsCtrl]); 

function TipsService($http) { 
    this.path = 'api/bondtipsfactor'; 
    this.tipsFactors = []; 
    this.getMinMaxDates = getMinMaxDates; 
    this.getData = getData; 

    function getMinMaxDates() { 

     var self = this; 
     var promise = $http.get(self.path + '/minmaxdate').then(function (result) { 
      return result.data; 
     }); 
     return promise; 
    } 
} 

function TipsCtrl(TipsService) { 
/* jshint validthis:true */ 

var vm = this, 
svc = TipsService; 
vm.title = 'TipsCtrl'; 
vm.setMonths = setMonths; 
var today = new Date(); 
vm.minMonth = 1; 
vm.minYear = today.getFullYear(); 
vm.maxYear = today.getFullYear(); 
vm.maxMonth = today.getMonth() + 1; 
vm.years = []; 
vm.months = []; 
vm.selectedYear = 2014; 
vm.selectedMonth; 
activate(); 
function activate() { 
    svc.getMinMaxDates().then(function (data) { 
     console.log(data); 
     var minDate = new Date(data.MinDate), 
       maxDate = new Date(data.MaxDate); 
     maxDate.setMonth(maxDate.getMonth() + 1); 
    vm.minMonth = minDate.getMonth(); 
    vm.minYear = minDate.getFullYear(); 
    vm.maxMonth = maxDate.getMonth(); 
    vm.maxYear = maxDate.getFullYear(); 
    for (var i = vm.minYear; i <= vm.maxYear; i++) { 
     vm.years[i - vm.minYear] = i; 
    } 
    }); 
} 

function setMonths(year) { 
    var startMonth = year === vm.minYear? vm.minMonth: 1, 
      endMonth = year === vm.maxYear ? vm.maxMonth : 12; 
    vm.month=[]; 
    for (var i = startMonth; i <= endMonth; i++) { 
     vm.months[i - startMonth] = i; 
    } 
} 
} 
})(); 

는 테스트 코드 여기

describe("TipsCtrlSpec", function() { 
describe("TipsCtrl", function() { 

    var ctrl, service, $q, $controller; 
    beforeEach(angular.mock.module("supportPortal", function($provide) { 
     service = jasmine.createSpyObj("TipsService", ['getMinMaxDates']); 
     $provide.value("TipsService", service); 
    })); 

    beforeEach(inject(function (_$controller_, _$q_, _TipsService_) { 
     service = _TipsService_; 
     $q = _$q_; 
     $controller = _$controller_; 
    })); 

    function createController(resolve) 
    { 
     var deferred = $q.defer(); 
     service.getMinMaxDates.and.returnValue(deferred.promise); 
     ctrl = $controller("TipsCtrl", { 
      TipsService: service 
     }); 
     if (resolve) { 
      deferred.resolve({ 
       MinDate: "01/01/2013", 
       MaxDate: "01/01/2014" 
      }); 
     } else { 
      deferred.reject(); 
     } 
    } 

    it("activate sets min max dates", function() { 
     createController(true); 
     expect(ctrl).toBeDefined(); 
     expect(service.getMinMaxDates).toHaveBeenCalled(); 
     expect(ctrl.minYear).toBe(2013); 
    }) 
}); 
}); 

입니다입니다 live code

답변

2

단위 테스트는 동 기적으로 시험의 흐름을 유지하고 수동의 다이제스트주기를 트리거 할 필요가 ngMock을 사용하여 실제로 돌아올 것을 약속합니다.

당신은 예를 들어 $rootScope.$digest()를 호출하여이 작업을 수행 할 수 있습니다 :

it("activate sets min max dates", function() { 
    createController(true); 
    $rootScope.$digest(); 
    expect(ctrl).toBeDefined(); 
    expect(service.getMinMaxDates).toHaveBeenCalled(); 
    expect(ctrl.minYear).toBe(2013); 
}); 

데모 :http://plnkr.co/edit/vWs1Dx0bjXsdrWCJKWh9?p=preview

관련 문제