У меня есть логика в моем обещании. Можно ли покрыть эту логику модульными испытаниями? Например, я запускаю событие Google Analytics внутри этого обещания в своем контроллере и хочу сделать что-то вроде expect($analytics.eventTrack).toHaveBeenCalledWith(...).
Наконец, способ охватить код, который находится внутри обещания, может быть следующим: предположим, что при сохранении некоторых данных мы запускаем событие GA внутри нашего обещания, в котором говорится, что данные были сохранены. У нас есть служба VoteService, которая имеет метод saveVote. Этот метод делает запрос на сервер и возвращает обещание. В рамках нашего обещания мы запускаем событие GA (когда сохранение было успешно выполнено). Чтобы написать тест для этого, нам нужно в beforeEach:
создать обещание saveVoteDeferrer = $q.defer(); разрешить обещание с помощью необходимого метода службы spyOn данных spyOn(VoteServiceMock,'saveVote') .and.returnValue(saveVoteDeferrer.promise);И затем в it ]:
создать обещание saveVoteDeferrer = $q.defer(); проверить, было ли событие GA возбуждено внутри нашего тела обещания expect($analytics.eventTrack) .toHaveBeenCalledWith('NewVoteAdded', {});Пример:
]voteController.js
var vm = this;
vm.addVote = function(){
//some logic goes here
VoteService.saveVote(vote)
.then(function(result){
//some logic goes here
$analytics.eventTrack('NewVoteAdded', {});
});
}
voteController.js
return function(){
this.saveVote = function($http){
// some logic goes here
return $http.post(/*needed parameters*/);
}
}
vote.spec.js
describe('some text', function(){
beforeEach(function () {
// inject what you need
// mock VoteService service
// inject voteController controller
var saveVoteDeferrer = $q.defer();
spyOn($analytics,'eventTrack');
saveVoteDeferrer.resolve({ data: { } });
spyOn(VoteServiceMock,'saveVote')
.and.returnValue(saveVoteDeferrer.promise);
it('fire GA event when the vote is saved', function(){
$ctrl.addVote();
expect($analytics.eventTrack)
.toHaveBeenCalledWith('NewVoteAdded', {}); });
});
});