我在诺言中有一些逻辑。单元测试是否可以涵盖这种逻辑?例如,我在控制器中的这个Promise中触发了Google Analytics(分析)事件,并且想要做类似expect($analytics.eventTrack).toHaveBeenCalledWith(...)
的事情。
答案 0 :(得分:0)
最后,覆盖promise内的代码的方法可以如下:
假设在保存一些数据时,我们会在诺言中触发一个GA事件,该事件表示已保存数据。
我们有一个服务<a id="top_of_page"></a>
<div id="content">loads of content</div>
<div id="back_to_top">
<a href="#top_of_page">
<img src="media/top.png">
</a>
</div>
,它有一个方法VoteService
。此方法向服务器发出请求并返回承诺。在我们的承诺内,我们触发GA事件(成功执行保存后)。
为此,我们需要在saveVote
中编写测试:
创建承诺beforeEach
使用所需数据解决承诺
spyOn服务的方法
saveVoteDeferrer = $q.defer();
然后在spyOn(VoteServiceMock,'saveVote')
.and.returnValue(saveVoteDeferrer.promise);
中输入:
调用包含服务方法的控制器方法:
it
$ctrl.addVote();
下面的示例:
voteController.js
expect($analytics.eventTrack)
.toHaveBeenCalledWith('NewVoteAdded', {});
VoteService.js
var vm = this;
vm.addVote = function(){
//some logic goes here
VoteService.saveVote(vote)
.then(function(result){
//some logic goes here
$analytics.eventTrack('NewVoteAdded', {});
});
}
vote.spec.js
return function(){
this.saveVote = function($http){
// some logic goes here
return $http.post(/*needed parameters*/);
}
}