2013-01-01 10 views
5

Sto scrivendo una libreria che supporta la navigazione del browser con l'aiuto di history.pushState e rileva anche lo popstate event che comunica quando la navigazione avviene nel browser. Mentre sto provando a scrivere i test Jasmine per questa libreria, mi chiedo come posso prendere in giro history.pushState e anche falsificare l'emissione del segnale popstate da window? I seguenti frammenti di codice dovrebbero chiarire il problema:Jasmine - Come posso prendere in giro history.pushState e anche emissione di eventi falsi?

Code Library:

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

Codice di prova (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'); 
    }); 
}); 

Fondamentalmente, voglio prendere in giro la funzione history.pushState ed emettono un falso popstate evento da window, in modo da testare la gestione di popstate in lib.

Vedere anche il mio fiddle per codice "funzionante".

risposta

2

È possibile spiare history.pushState come questo:

spyOn(history, 'pushState'); 

Come si utilizza jQuery per legare l'evento si può semplicemente attivare popstate da soli.

$(window).trigger('popstate') 
Problemi correlati