【问题标题】:Jasmine unit test for angular service In controller控制器中角度服务的茉莉花单元测试
【发布时间】:2017-10-09 11:06:47
【问题描述】:

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

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

现在,我想为上述方法编写一个单元测试。我能够使用 Promise 对 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();
         });

       });
   });

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

【问题讨论】:

  • 为什么你不能监视它? spyOn(scope, 'populateEmpData');
  • @fqhv 感谢您的回复。我忘了添加。我已经添加了,但是测试失败了。
  • 当你添加那个错误是什么?
  • 我是第一次自己添加的。错误是“预期的间谍 populateEmpData 已被调用。”
  • 你永远不会兑现你的承诺。而且你没有在解决它之后调用 scope.$apply() 。所以永远不会调用 promise 回调。

标签: angularjs unit-testing jasmine karma-jasmine


【解决方案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();

【讨论】:

  • 感谢您的回复。得到另一个错误$scope.getEmpInfo = function() { EmpService.getInfo($scope.empid) .then(function(data) { $scope.empData = data[0]; $scope.populateEmpData($scope.empData); }, function(reason) { //do nothing } }我正在获取数据 [0] 是未定义的。在运行测试用例时
  • TypeError: undefined is not an object (evalating 'data[0]') - 这是我得到的错误。它指的是我的方法。
  • 这是因为,您在成功调用中没有传递任何数据。 var 数据 = ['anydata']; spyOn(empService,"getInfo").and.callFake(function() { return { then : function(success, error) { success(data); } } }
【解决方案2】:

你永远不会兑现你的承诺。你需要调用 $scope.$apply()。

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

查看上面的链接,它会对您有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-19
    • 2013-06-16
    • 2016-06-14
    • 2014-09-26
    • 2022-01-19
    相关资源
    最近更新 更多