Jasmine - 我如何模拟history.pushState以及假事件发射?

时间:2013-01-01 13:41:18

标签: javascript jquery testing mocking jasmine

我正在编写一个在history.pushState的帮助下支持浏览器导航的库,并且还会捕获在浏览器中进行导航时进行通信的popstate event。当我正在尝试为此库编写Jasmine测试时,我想知道如何模仿history.pushState并伪造来自popstate的{​​{1}}信号的发射?以下代码片段应该阐明问题:

图书馆代码:

window

测试代码(Jasmine):

var lib = (function() {
    function navigate(path) {
        history.pushState(null, null, path);
    }

    function onPopState(event) {
        if (lib.callback) {
            lib.callback(document.location);
        }
    }

    $(window).bind('popstate', onPopState);

    return {
        navigate: navigate
    };
})();

基本上,我想模仿describe("Test navigate", function() { it("Should invoke callback upon state change", function() { var invokedWith; function callback(url) { invokedWith = url; } lib.callback = callback; lib.navigate('/path'); // Doesn't work, callback invoked asynchronously expect(invokedWith).toEqual('/path'); }); }); 函数并从history.pushState发出假popstate个事件,以便测试window中的popstate处理

另请参阅我的fiddle了解“工作”代码。

1 个答案:

答案 0 :(得分:3)

你可以像这样窥探history.pushState

spyOn(history, 'pushState');

当您使用jquery绑定事件时,您可以自行触发popstate

$(window).trigger('popstate')