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

时间:2014-07-04 23:03:54

标签: javascript jasmine

我做了一个简单的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/

1 个答案:

答案 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 }},runswaits方法(source)和2.0+,您可以使用waitsFor方法(source)。

来自MDN(postMessage):

  

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