用于角度服务的Jasmine单元测试在控制器中

时间:2017-05-10 16:55:20

标签: angularjs unit-testing jasmine karma-jasmine

我是茉莉花框架的新手。我已经完成了一些教程并学习并开始编写单元测试。这里面临的一个问题是描述。 我有一个控制器,我可以调用服务调用来获取数据。请参阅下面的代码。

$scope.getEmpInfo = function() {
  EmpService.getInfo($scope.empid)
     .then(function(data) {
        $scope.empData  = data;
        $scope.populateEmpData($scope.empData);
     }, function(reason) {
        //do nothing
    } 
}

现在,我想为上述方法编写一个单元测试。我能够使用诺言对serice进行间谍,但我无法窥探$scope.populateEmpData()。这是我的测试用例。

    describe('Emp data', function() {
       var d, scope;
       beforeEach(function() {
          module("emp");
          module("emo.info");
       });
       describe('empcontroller', function() {
          beforeEach(inject(function($q,_EmpService_, $controller,$rootScope){
              d = $q.defer();
              empService = _EmpService_;
              spyOn(empService,"getInfo").and.returnValue(d.promise);
              scope = $rootScope.$new();
              empCtrl = $controller("empController", {
                $scope: scope,
              });
           }));
         it('should get the Employee information ', function() {
                scope.getEmpInfo();
                spyOn(scope,'populateEmpData');
                expect(EmpService.getInfo).toHaveBeenCalled();
                //Here im getting the error.
                expect(scope.populateEmpData).toHaveBeenCalled();
         });

       });
   });

请帮助解决此问题。提前谢谢。

2 个答案:

答案 0 :(得分:1)

这是因为你没有解决承诺。你必须在spyOn中做出改变。

 - spyOn(empService,"getInfo").and.callFake(function() {
            return {
                  then : function(success, error) {
                     success();
                }  
         } }

Now, it will go into the success callback and will try to call $scope.populateEmpData();

答案 1 :(得分:0)

你永远不会解决你的承诺。你需要调用$ scope。$ apply()。

  

为什么这有必要?因为使用$ q服务做出的任何承诺   每次运行角度时都要处理要解决/拒绝的问题   消化周期。从概念上讲,对.resolve的调用改变了状态   承诺并将其添加到队列中。每次角度的消化周期   运行,任何未完成的承诺将被处理和删除   队列。   Unit Testing with $q Promises in AngularJS

检查上面的链接它会对你有所帮助。