Angular 单元测试:如何调用命名函数

Angular Unit Testing: How do i call a named function

我有一个控制器,其中包含一个命名函数。

function controller($scope, ...){
   function foo(data){ 
     //logic for other stuff
     $log(data);
 }

 //some promise stuff
waiting.then(function(data){
  foo(data);
});

对于函数可用的方式,我不想将 foo 分配给范围变量,因为这样做是这样的:

$scope.foo = function(data) {}

被人皱眉? (不确定......但因为我不是从视图中调用 foo,所以我不明白为什么我会这样做)

我的问题是,如何从单元测试 "it" 块中调用 foo 函数?

  it('expect calling function', function(){
    foo(data);
});

这给我错误

无法在控制器外部调用 foo 函数,因为 foo 是闭包 - 内部函数已定义且仅在控制器函数体内可用。 参见 https://developer.mozilla.org/cs/docs/Web/JavaScript/Closures#Lexical_scoping

我更喜欢 angular 控制器的 controllerAs 语法。 Controller 是普通的对象构造函数,其属性和方法定义在 this 上。 绑定到范围仅在评估 ng-controller 指令(或路由显示)期间出现。

通常,您可以在测试中创建控制器实例,模拟依赖项 (waiting) 并更轻松地使用 spies 进行断言函数调用。

http://toddmotto.com/digging-into-angulars-controller-as-syntax/