2013-05-21 42 views
13

我在我的Angular应用程序中有一个事件监听器的控制器,定义如下。

angular.module('test').controller('TestCtrl', function($rootScope, $scope, testService) { 

    [...] 

    $scope.$on("myEvent", function(args, value) { 
     testService.doStuff(value); 
    }); 
    }); 

这完美地在应用程序本身。然而,当我尝试单元测试控制器(使用茉莉)的功能,每个测试方法引发以下错误:

TypeError: $scope.$on is not a function in [...]/testController.js 

创建所述控制器在我的测试方法如下所述。

it('does stuff', inject(function($rootScope, $controller, testService) { 
    var scope = $rootScope.$new; 
    $controller('TestCtrl', { 
     $scope : scope 
    }); 

    [...] 
    })); 

我能找到解决这个问题,通过改变我的控制器使用rootScope代替:

$rootScope.$on(...) 

但随后的过程应用程序已经不正常工作。我也可以摆脱错误的在我的测试代码引入$on方法:

var scope = $rootScope.$new; 
    scope.$on = function() {}; 

但嘲讽听众喜欢这种失败的测试我真正的代码的目的。

为什么不测试代码中找到的scope$on方法?(但在rootScope上找到它,仍然...)

必须有一些基本的东西,我在这里失踪了,但是我还是无法弄清楚,即使经过大量的谷歌搜索和阅读Angular源代码。

回答

16

$rootScope.$new是一个函数。你需要调用它($rootScope.$new()):

it('does stuff', inject(function($rootScope, $controller, testService) { 
    var scope = $rootScope.$new(); 
    $controller('TestCtrl', { 
    $scope : scope 
    }); 

    [...] 
})); 

例普拉克:http://plnkr.co/edit/t1x62msmOQDkNItGzcp9?p=preview

+0

谢谢!这真是一个令人尴尬的错误......(唉!)我不知道为什么我会这样写,但是这个错误已经感染了我所有的测试类。 – MJV