【问题标题】:AngularJs - How to write testable controllers with private MethodsAngularJs - 如何使用私有方法编写可测试的控制器
【发布时间】:2015-07-16 18:26:54
【问题描述】:

我正在尝试使用 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 已被调用。

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

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

【问题讨论】:

  • 你在每次测试前加载模块吗?
  • 我认为唯一可以测试的方法是 myFunc 是否正在以某种可以确认的方式改变控制器的状态
  • 是的,我认为@Chandermani 是正确的。在调用$controller 之前 必须在controller 引用上spy。然后间谍将能够记录其构造函数中发生的事情。
  • 是的,我加载了模块。 @DavinTryon 你能发布一个代码示例吗?
  • 什么代码示例?

标签: javascript angularjs unit-testing testing jasmine


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多