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

时间:2015-07-14 15:12:54

标签: angularjs testing karma-mocha

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

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);
});

这给了我错误

1 个答案:

答案 0 :(得分:2)

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

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

通常,您可以在test,mock dependencies(waiting)中创建控制器实例,并更容易使用spies进行断言函数调用。

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