我做了一个简单的Jasmine测试,从postMessage调用一个间谍,但它失败了。
我在这里缺少什么?
it('Should trigger message event', function () {
var spy = jasmine.createSpy('message');
window.addEventListener('message', function (e) {
console.log(Object.keys(e), e.data); // this logs as expected
spy();
});
window.postMessage('test', '*');
expect(spy).toHaveBeenCalled();
});
答案 0 :(得分:4)
postMessage
以异步方式运行,因此您可以在发布消息之前以及在事件被触发之前达到预期效果。
我重写了你的测试,它运行良好:
describe('Message', function () {
var spy;
beforeEach(function() {
spy = jasmine.createSpy('message');
window.addEventListener('message', function (e) {
console.log(Object.keys(e), e.data);
spy();
});
window.postMessage('test', '*');
});
it('Should trigger message event', function () {
expect(spy).toHaveBeenCalled();
});
});
它完成了这项工作,但我不知道它是否是最佳解决方案,因为Jasmine为我们提供了测试异步方法的能力:pre-2.0,你可以使用{{1 }},runs
和waits
方法(source)和2.0+,您可以使用waitsFor
方法(source)。
当调用window.postMessage方法时,当任何必须执行的挂起脚本完成时,会导致在目标窗口调度MessageEvent。