首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何测试调用私有函数的控制器函数,而私有函数又在angularjs中调用异步函数

如何测试调用私有函数的控制器函数,而私有函数又在angularjs中调用异步函数
EN

Stack Overflow用户
提问于 2015-07-06 10:57:51
回答 1查看 411关注 0票数 1

[plunkr][1]http://plnkr.co/edit/Jk1Rp3nEgUQTmDOs3xBl?p=preview

我的当前代码如下所示。

代码语言:javascript
复制
angular.module("app",[])
  .service("dataService",function($http){
    this.get = function (url) {
      return $http.get(url);
    };
  })
  .service("mainService",function(dataService){
    this.getData = function(pattern){
      return dataService.get(pattern+"/abc");
    }
  })
  .controller("mainController",function($scope,mainService){
    $scope.refreshData = function(pattern){
      loadData(pattern);
    }

  function loadData(pattern){
    mainService.getData(pattern)
      .success(function(data){
        console.log(data);
      })
      .error(function(error){
        console.log(error);
      })
  }
})

我一直试图弄清楚如何通过阅读博客来测试它,但是每个博客要么有不同的方法,要么博客已经有2-3年的历史了。我想知道如何测试控制器?

我应该测试每个功能吗?如果是,那么我应该如何测试私有函数?使用私有函数是个好主意,还是应该将私有函数代码添加到作用域函数中?

还有更好的方法来编写这个函数吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-06 13:42:11

最重要的部分是我们要创建存根:

代码语言:javascript
复制
beforeEach(function() {
    var $httpResponse = {
        success: function() {
            return $httpResponse;
        },
        error: function() {
            return $httpResponse;
        }
    };
    var _stubMainService_ = {
        getData: jasmine.createSpy('getData').and.returnValue($httpResponse)
    };

    angular.module('app')
        .value('mainService', _stubMainService_);
});

以及使用它的测试:

代码语言:javascript
复制
it('rereshes data', function() {
    var pattern = 'abcde';
    scope.refreshData(pattern);
    expect(mainService.getData).toHaveBeenCalledWith(pattern);
});

代码语言:javascript
复制
angular.module("app", [])
  .service("dataService", function($http) {
    this.get = function(url) {
      return $http.get(url);
    };
  })
  .service("mainService", function(dataService) {
    this.getData = function(pattern) {
      return dataService.get(pattern + "/abc");
    }
  })
  .controller("mainController", function($scope, mainService) {
    $scope.refreshData = function(pattern) {
      loadData(pattern);
    }

    function loadData(pattern) {
      mainService.getData(pattern)
        .success(function(data) {
          console.log(data);
        }).error(function(error) {
          console.log(error);
        })
    }
  })

describe('mainController()', function() {
  var scope, controller, mainService, $q;

  beforeEach(module('app'));

  beforeEach(function() {
    var $httpResponse = {
        success: function() {
          return $httpResponse;
        },
        error: function() {
          return $httpResponse;
        }
      };
    var _stubMainService_ = {
      getData: jasmine.createSpy('getData').and.returnValue($httpResponse)
    };

    angular.module('app')
      .value('mainService', _stubMainService_);
  });


  beforeEach(inject(function($controller, $rootScope, _mainService_) {
    scope = $rootScope.$new();
    controller = $controller('mainController', {
      $scope: scope
    });
    mainService = _mainService_;
  }));

  it('rereshes data', function() {
    var pattern = 'abcde';
    scope.refreshData(pattern);
    expect(mainService.getData).toHaveBeenCalledWith(pattern);
  });
})
代码语言:javascript
复制
<link href="//safjanowski.github.io/jasmine-jsfiddle-pack/pack/jasmine.css" rel="stylesheet" />
<script src="//safjanowski.github.io/jasmine-jsfiddle-pack/pack/jasmine-2.0.3-concated.js"></script>
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular-mocks.js"></script>

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31244111

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档