【发布时间】:2015-06-11 18:12:20
【问题描述】:
我正在尝试使用 Jasmine 2.0 为 AngularJS 应用程序中的某些逻辑编写单元测试,但该逻辑位于事件侦听器中。从控制器:
window.addEventListener('message', function(e) {
if (e.data === "sendMessage()") {
$scope.submit();
}
}, false);
从测试文件中:
describe("post message", function() {
beforeEach(function(done) {
var controller = createController(controllerParams);
spyOn($scope, 'submit');
window.postMessage('sendMessage()', '*');
done();
});
it('should submit on a sent message', function (done) {
expect($scope.submit).toHaveBeenCalled();
done();
});
});
但测试失败了,间谍从未被击中。来自控制台调试语句的额外信息:
-
控制器中的
window.addEventListener被调用。 -
beforeEach和it块都被调用。 - 控制器中的上述消息处理程序在测试期间未被调用。
- 此测试中发送的消息最终会被消息处理程序多次接收,但直到测试结束。
我的测试在这里遗漏了什么?
【问题讨论】:
-
难道你不应该在 another 窗口上调用 postMessage 而不是接收事件的窗口吗? (比如说,创建一个弹出窗口,就像在 developer.mozilla.org/en-US/docs/Web/API/Window/… 上所做的那样)
-
尝试将其更改为来自窗口弹出窗口的帖子消息,而不是来自窗口的帖子消息,但所有改变的是,它不会太晚收到消息,而是不会在全部。
-
@AlanGordon:你已经找到解决方案了吗?我有同样的问题;-)
标签: javascript angularjs unit-testing jasmine postmessage