通过单元测试从诺言中覆盖代码

时间:2018-08-13 12:42:01

标签: angularjs jasmine karma-jasmine

我在诺言中有一些逻辑。单元测试是否可以涵盖这种逻辑?例如,我在控制器中的这个Promise中触发了Google Analytics(分析)事件,并且想要做类似expect($analytics.eventTrack).toHaveBeenCalledWith(...)的事情。

1 个答案:

答案 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中编写测试:

  1. 创建承诺beforeEach

  2. 使用所需数据解决承诺

  3. spyOn服务的方法

    saveVoteDeferrer = $q.defer();

然后在spyOn(VoteServiceMock,'saveVote') .and.returnValue(saveVoteDeferrer.promise);中输入:

  1. 调用包含服务方法的控制器方法:

    it

  2. 验证是否在我们的承诺体内触发了GA事件 $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*/);
  }
}