如何以角度测试事件?

Ken*_*nne 66 unit-testing javascript-events jasmine angularjs angularjs-directive

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

最好的方法是什么?

dnc*_*253 121

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

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

如果你不需要或者不想担心传递的参数$emit,你可以$on在上面$rootScope设置一个标志来知道发出的事件.像这样的东西:

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

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

$rootScope.$broadcast("EVENT_TO_TEST", other, possible, args);
//expects for event here
Run Code Online (Sandbox Code Playgroud)

现在,我想这个事件处理将发生在指令或控制器(或两者)中.有关设置指令测试,请参阅https://github.com/vojtajina/ng-directive-testing.有关设置控制器测试的信息,请参阅https://github.com/angular/angular-phonecat/blob/master/test/unit/controllersSpec.js#L27

希望这可以帮助.