用于postMessage事件失败的Jasmine spy()

Jasmine spy() for postMessage event failing

本文关键字:spy Jasmine postMessage 事件 失败 用于      更新时间:2023-09-26

我做了一个简单的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();
});

http://jsfiddle.net/4L9Vc/

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为我们提供了测试异步方法的能力:2.0之前,您可以使用runs, waitswaitsFor方法(源),2.0+您可以使用done方法(源)。

From MDN (postMessage):

窗口。当调用postMessage方法时,当任何必须执行的挂起脚本完成时,将在目标窗口上调度MessageEvent。