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".