Jasmine测试postMessage API

时间:2014-04-16 13:35:55

标签: javascript unit-testing asynchronous jasmine

我试图在我的脚本中测试异步postMessage API,它在真正的浏览器中运行良好但是为它创建测试相当复杂。 为了说明这种情况,我编写了这个简化的测试用例:

describe('calling postMessage asynchronously', function () {
    var ctx;
    beforeEach(function () {
        jasmine.clock().install();
        ctx = {
            msgHandler:function() {
                console.log('msgHandler');
            }
        };
    });
    afterEach(function () {
        jasmine.clock().uninstall();
    });
    it('handles a postMessage asynchronously', function() {
        window.addEventListener('message', ctx.msgHandler);
        spyOnEvent('window', 'message');
        spyOn(ctx, 'msgHandler');
        setTimeout(function() {
            window.postMessage('another bam', '*');
        }, 10);
        jasmine.clock().tick(11);
        expect(ctx.msgHandler).toHaveBeenCalled();
    });
});

现在为什么没有调用消息处理程序?

1 个答案:

答案 0 :(得分:0)

describe('window.postMessage test', function() {
    var o;
    beforeEach(function(done) {
        o = {
            f: function() {
                o.f2();
            },
            f2: function() {}
        };
        window.addEventListener('message', o.f, false);
        spyOn(o, 'f2').and.callFake(function() {
            done();
        });
        window.postMessage('another bam', '*');
    });
    it('works...', function() {
        expect(o.f2).toHaveBeenCalled();
    });
});