我需要测试事件是否被正确发射或广播,并手动触发事件。做这件事的最好方法是什么?
whlutmcx1#
如果你只是需要一些关于事件触发和捕捉的测试,我是这样做的。为了确保某个事件被触发($emit-ed或$broadcast-ed),间谍是一个不错的选择。你需要一个对将要调用$emit或$broadcast的作用域的引用,然后做一些类似这样的事情:
$emit
$broadcast
spyOn(scope, "$emit") //run code to test expect(scope.$emit).toHaveBeenCalledWith("MY_EVENT_ID", other, possible, args);
如果你不需要或者不想担心$emit传递的参数,你可以在$rootScope上放置一个$on,并设置一个标志来知道事件已经发出。
$rootScope
$on
var eventEmitted = false; $rootScope.$on("MY_EVENT_ID", function() { eventEmitted = true; }); //run code to test expect(eventEmitted).toBe(true);
对于测试捕获事件时运行的功能($on)来说,要简单一些,只需从inject函数中获取一个$rootScope,然后发送所需的事件。
inject
$rootScope.$broadcast("EVENT_TO_TEST", other, possible, args); //expects for event here
现在,我想这个事件处理将发生在一个指令或控制器(或两者)中。要设置指令测试,请参见https://github.com/vojtajina/ng-directive-testing。要设置控制器测试,请参见https://github.com/angular/angular-phonecat/blob/master/test/unit/controllersSpec.js#L27
xwmevbvl2#
下面是在Angular JS中$broadcast event应该遵循的步骤注入时,初始化rootScope和作用域存根,如下所示:
var rootScope; var scopeStub = beforeEach(function() { inject(function($rootScope, _$controller_) { rootScope = $rootScope; scopeStub = $rootScope.$new(); $controller = _$controller_; }); });
创建控制器后,使用rootScope引发事件,如下所示:
rootScope.$broadcast('eventName', parameter1);
fykwrbwg3#
我们用这个sintax做A1
=========== Controller ======== var vm = this; $scope.$on('myEvent', function(event, data){ console.log('event number', data.id); }); ============ Test ============= it('should throw myEvent', function() { var data = {}; $scope.$broadcast('myEvent', {id:1}); $scope.$broadcast('myEvent', {id:2}); $scope.$broadcast('myEvent', {id:3}); }); ============ Output ============ Chrome LOG: '--------------------------------------------' Chrome LOG: 'event number', 1 Chrome LOG: 'event number', 2 Chrome LOG: 'event number', 3
3条答案
按热度按时间whlutmcx1#
如果你只是需要一些关于事件触发和捕捉的测试,我是这样做的。为了确保某个事件被触发(
$emit
-ed或$broadcast
-ed),间谍是一个不错的选择。你需要一个对将要调用$emit
或$broadcast
的作用域的引用,然后做一些类似这样的事情:如果你不需要或者不想担心
$emit
传递的参数,你可以在$rootScope
上放置一个$on
,并设置一个标志来知道事件已经发出。对于测试捕获事件时运行的功能(
$on
)来说,要简单一些,只需从inject
函数中获取一个$rootScope
,然后发送所需的事件。现在,我想这个事件处理将发生在一个指令或控制器(或两者)中。要设置指令测试,请参见https://github.com/vojtajina/ng-directive-testing。要设置控制器测试,请参见https://github.com/angular/angular-phonecat/blob/master/test/unit/controllersSpec.js#L27
xwmevbvl2#
下面是在Angular JS中$broadcast event应该遵循的步骤
注入时,初始化rootScope和作用域存根,如下所示:
创建控制器后,使用rootScope引发事件,如下所示:
fykwrbwg3#
我们用这个sintax做A1