2013-01-01 9 views
5

私はhistory.pushStateの助けを借りてブラウザのナビゲーションをサポートするライブラリを作成しており、ブラウザでナビゲーションが行われるときに通信するpopstate eventもキャッチしています。私はこのライブラリのためにJasmineのテストを書こうとしているので、私はwindowからpopstateシグナルの放出を擬似することができますか?history.pushStateをどうやって模倣できるのでしょうか?次のコードスニペットは、問題を解明する必要がありますジャスミン - どのように私はhistory.pushStateをモックして、イベントの排出を偽装できますか?

ライブラリコード:

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ハンドリングをlibでテストします。

「作業中」のコードについては、fiddleも参照してください。

答えて

2

あなたはこのようなhistory.pushStateをスパイすることができます:あなたは単に自分でpopstateをトリガすることができ、イベントをバインドするためにjqueryのを使用したよう

spyOn(history, 'pushState'); 

$(window).trigger('popstate') 
関連する問題