AngularJs - 如何使用私有方法编写可测试控制器

时间:2015-05-06 14:32:05

标签: javascript angularjs unit-testing testing jasmine

我正在尝试使用angular.js + jasmine为我的一个控制器编写测试。

我们说我有一个控制器

angular.module('app').controller('MyCtrl', function() {
    this.myFunc = function() {
        // ...
    };

    activate();

    function activate() {
        this.myFunc();
    }
});

该控制器有一个名为activate()的函数,在创建控制器时调用该函数。

如何为activate()函数编写测试? (像这样:创建控制器时,应调用控制器函数" myFunc()")

我试着写这样的东西:

describe('activate() controller', function() {
    it('should call function myFunc', inject(function($rootScope, $controller) {
        var locals     = {$scope: $rootScope.$new()};
        var controller = $controller('MyCtrl', locals);

        spyOn(controller, 'myFunc').toHaveBeenCalled();
    });
}

但我收到错误:

  

已经调用了预期的间谍myFunc。

我认为在创建我的间谍时,控制器已经调用了激活功能。

有没有办法测试这样的控制器?

1 个答案:

答案 0 :(得分:1)

上面的代码示例在初始化时执行myFunc方法。因此,当您附加间谍时,它已经被执行。更好的测试方法是检查myFunc执行的转换。

如果该方法是服务的一部分,您可以在注入中设置您的间谍,然后初始化控制器并期望调用服务方法。