2014-11-11 2 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

Смежные вопросы