Javascript 单元测试$scope.$on-未捕获事件
我有一个带有简单$scope的控制器。$on:Javascript 单元测试$scope.$on-未捕获事件,javascript,angularjs,jasmine,karma-jasmine,jasmine-jquery,Javascript,Angularjs,Jasmine,Karma Jasmine,Jasmine Jquery,我有一个带有简单$scope的控制器。$on: app.controller('MyController', function($scope) { $scope.$on("myBroadRcvr", function(event, data) { $scope.name = data.name; $scope.empID = data.empID; }); }); 我曾经尝试过这样的单元测试: describe('MyController', f
app.controller('MyController', function($scope) {
$scope.$on("myBroadRcvr", function(event, data) {
$scope.name = data.name;
$scope.empID = data.empID;
});
});
我曾经尝试过这样的单元测试:
describe('MyController', function () {
var $scope, super_controller;
beforeEach(function(){
module('myApp');
inject(function($rootScope, $controller){
$scope = $rootScope.$new();
spyOn($scope, '$on');
super_controller = $controller('MyController', {$scope: $scope});
});
});
it('should receive name as test', function (){
var myData = {name: 'test', empID: 'eg7gg'},
var sub_scope = $scope.$new();
sub_scope.$broadcast('myBroadRcvr', myData);
expect($scope.$on).toHaveBeenCalled();
expect($scope.name).toBe('test');
});
});
通过以上内容,我得到:
Expected undefined to be 'test'.
您的
子作用域
是$scope
的子作用域,但是$broadcast
将事件向下发送到作用域层次结构,因此父作用域上的侦听器(在本例中为$scope
)无法捕获它。您应该改用$emit
,如下所示:
sub_scope.$emit('myBroadRcvr', myData);
见:
将事件名称向下分派给所有子作用域(及其子作用域),通知已注册的$rootScope.Scope侦听器
(与之对比,向上发送。)
您的代码还有一个小的语法错误:行
var myData={name:'test',empID:'eg7gg'},
应该以结尾改为code>。期望($scope.$on).toHaveBeenCalled()
也应该失败,不是吗。@Pavlo-这里似乎没有失败,这很有用。。然而,我仍然得到相同的错误。在我的控制器中,$scope.name=data.name。。。所以在我的测试中,应该是$scope.myData.name吗?不,应该是$scope.name
。您还有一个轻微的语法错误,分配myData
的行应该以结尾代码>而不是,
。基本原理对我来说是可行的,你能发布一个重新创建不需要的行为吗?所以稍微改进一下,我需要spyOn($scope,$emit');在我的inject和expect($scope.$emit).tohavencalledwith(“myBroadRcvr”,{name:'test',empID:'eg7gg'});似乎通过了,但预期($scope.name).toBe('test');失败插入expect($scope.$emit)。TohaveEncalled…
只会告诉您在测试中调用了$emit
,这没有用。无论如何,我建议您现在删除spy-如果您用spy替换emit,实际的$emit
将不会发生,除非您在spy上调用和callthrough
。请尝试在plunkr或任何其他程序中重新创建您的问题,在没有看到您的设置的情况下提供帮助变得越来越困难。@OamPsy我分叉了您的plunkr:,我添加了最初的预期,并且它通过了测试-我不确定,是什么问题。(我取消了spy部分的注释,它们是不必要的,您可以添加它们,但是您也需要添加和callthrough()
,这样您的实际处理程序才能运行。(我在注释中也添加了该部分)