spyOn $ rootScope导致$ scope也被监视

时间:2014-01-02 08:25:36

标签: javascript unit-testing angularjs mocking jasmine

我同时设置$rootScope$scope来收听某些事件。在单元测试(Jasmine)中,我想测试控制器的$scope.$on处理程序,而不是测试范围之外的$rootScope.$on。因此,我试图窥探$rootScope.$on,使其调用带有以下代码的假函数

 $rootScope = _$rootScope_;
 $scope = $rootScope.$new();
 spyOn($rootScope, '$on').andCallFake(function () { }); //let $rootScope skip the $on handler

不幸的是,我发现$scope的代码结果也被预防了。

对此有任何解决方案吗?

1 个答案:

答案 0 :(得分:2)

问题是$ scope继承自$ rootScope并共享相同的'$ on'。

我能看到的唯一解决方案是直接在$ scope对象上设置$ on函数(这样$ scope不会在函数上继承$):

// Affect $on function on $scope object
// This way $scope has its own $on function
$scope.$on = $rootScope.$on;

// Spy $on function on $rootScope only
spyOn($rootScope, '$on');

看到这个小提琴:http://jsfiddle.net/dv5TA/1