测试对controller (angular)不可见的javascript函数



我使用控制器作为angular语法,我想使用jasmine和sinon测试我的代码。

假设我想要以下控制器代码:

angular
    .module('Test')
    .controller('TestController', TestController);
TestController.$inject = [];
function TestController() {
         var viewModel = this;
         viewModel.myFunction = myFunction;
         function myFunction(){
            //do something
            //now call a helper function
            helperFunction()
         }
         function helperFunction(){
             // ....
         }
}

我的问题是我怎么能测试helperFunction(),甚至把一个间谍吗?我的helper在我的测试中不可见。

下面是我的测试:

(function () {
    'use strict';
     var myController;
     describe('Test', function () {
         beforeEach(module('Test'));
         beforeEach(inject(function ($controller, $injector) {         
               myController = $controller('TestController');
         }));
         it('Tests helperFunction', function (){
              var sinonSpy = sinon.spy(myController, 'helperFunction');
              //perform the action
              myController.myFunction();
             //expect the function was called - once
             expect(sinonSpy .callCount).toEqual(1);
          }
    })
 })

您不能访问这些函数。当你定义一个命名的JS函数时就相当于说:

var helperFunction = function(){};

在这种情况下,可以很清楚地看到var仅在块内的作用域中,并且没有来自包装控制器的外部引用。

要使一个函数可测试,你需要把它添加到控制器的$作用域。

viewModel.helperFunction = helperFunction;

但是请注意,仅仅为了使其可测试而暴露所有内容并不是一个好主意。你真的需要考虑测试它是否真的会给你的项目增加一些价值

尝试这样做:

 var vm = controller("helperFunction", { $scope: scope });

然后:

vm.myFunction();

在控制器中添加以下代码:

  angular.extend($scope, {
      helperFunction:helperFunction
    });

最新更新