javascript - AngularJs - 如何使用私有(private)方法编写可测试的 Controller

标签 javascript angularjs unit-testing testing jasmine

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

假设我有一个 Controller

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

    activate();

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

这个 Controller 有一个名为 activate() 的函数,在创建 Controller 时调用。

如何为 activate() 函数编写测试? (像这样:创建 Controller 时,应该调用 Controller 函数“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();
    });
}

但是我得到了错误:

Expected spy myFunc to have been called.

我想在我创建 spy 时, Controller 已经调用了激活函数。

有没有办法像这样测试 Controller ?

最佳答案

上面的代码示例在初始化时执行 myFunc 方法。因此,当你附加 spy 时,它已经被处决了。更好的测试方法是检查 myFunc 执行了哪些转换。

如果该方法是服务的一部分,您可以在注入(inject)中设置 spy ,然后初始化 Controller 并期望调用服务方法。

关于javascript - AngularJs - 如何使用私有(private)方法编写可测试的 Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30079766/

相关文章:

javascript - 如何在 html 搜索方法期间修复列大小?

javascript - 如果变量未定义,如何在 IE 中优雅地失败而不是看到 SCRIPT5009?

javascript分组链接节点

angularjs - 当元素最初被隐藏时,Angular 动画在第一次运行时无法正常工作

scala - 在 Play 2.6 中对 Controller 进行单元测试

javascript - 使用 jQuery 为图像序列制作动画的 gif 动画替代方案

javascript - 在 ng-options 中选择默认值

javascript - Angularjs:错误:[ng:areq] 参数 'HomeController' 不是函数,未定义

unit-testing - NUnit 没有运行我的测试用例

java - 检查单元测试是否委托(delegate)了所有方法