2013-01-01 8 views
5

Piszę bibliotekę, która obsługuje nawigację w przeglądarce przy pomocy history.pushState, a także przechwytuje popstate event, która komunikuje się, gdy nawigacja odbywa się w przeglądarce. Kiedy próbuję pisać testy Jasmine dla tej biblioteki, zastanawiam się, w jaki sposób mogę wykpić history.pushState, a także sfałszować emisję sygnałuz window? Poniższe fragmenty kodu powinien wyjaśnić problem:Jaśmin - Jak wyśmiać history.pushState, a także fałszywą emisję zdarzeń?

kod Biblioteka:

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 
    }; 
})(); 

kod testowy (Jasmine):

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'); 
    }); 
}); 

Zasadniczo, chcę drwić funkcję history.pushState i emitować fałszywe popstate wydarzenie od window, aby przetestować obsługę popstate w .

Zobacz także mój kod fiddle dla "pracy".

Odpowiedz

2

można szpiegować history.pushState tak:

spyOn(history, 'pushState'); 

Jak użyć jQuery powiązać zdarzenie można po prostu wywołać popstate samemu.

$(window).trigger('popstate') 
Powiązane problemy