66

我需要测试事件是否正确发出或广播,并手动触发事件。

最好的方法是什么?

4

3 回答 3

121

如果您只需要对事件触发和捕获进行一些测试,我就是这样做的。为了确保某个事件被触发($emit-ed 或$broadcast-ed),间谍是要走的路。您需要引用将调用$emitor的范围$broadcast,然后执行以下操作:

spyOn(scope, "$emit")
//run code to test
expect(scope.$emit).toHaveBeenCalledWith("MY_EVENT_ID", other, possible, args);

如果您不需要或不想担心与 一起传递的参数$emit,您可以在$on上放置一个$rootScope并设置一个标志以知道事件已发出。像这样的东西:

var eventEmitted = false;
$rootScope.$on("MY_EVENT_ID", function() {
   eventEmitted = true;
});
//run code to test
expect(eventEmitted).toBe(true);

对于在捕获事件时运行的测试功能 ( $on),它更容易一些。只需$rootScopeinject函数中获取一个,然后发送所需的事件。

$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

希望这可以帮助。

于 2013-03-07T22:22:34.153 回答
0

以下是 Angular JS 中 $broadcast 事件应遵循的步骤

在注入时初始化 rootScope 和范围存根,如下所示:

var rootScope;
var scopeStub = beforeEach(function() {
    inject(function($rootScope, _$controller_) {
        rootScope = $rootScope;
        scopeStub = $rootScope.$new();
        $controller = _$controller_;
    });
});

使用 rootScope 创建控制器后引发事件,如下所示:

rootScope.$broadcast('eventName', parameter1);
于 2016-09-26T20:21:12.820 回答
0

我们将这个语法用于 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
于 2017-11-30T11:10:24.740 回答