2013-07-03 7 views
29

Ho bisogno di testare il codice JavaScript che si basa su setTimeout per eseguire attività periodiche. Come posso, dai miei test di Mocha, simulare il passare del tempo in modo che vengano richiamati i callback setTimeout?Come posso simulare il passare del tempo nei test Mocha in modo che vengano chiamati callback setTimeout?

Sono fondamentalmente alla ricerca di funzionalità simili a Jasmine's Mock Clock, che consente di anticipare il tempo JavaScript di un numero di segni di graduazione.

risposta

49

Ho scoperto che Sinon.JS supporta la manipolazione dell'orologio JavaScript, tramite sinon.useFakeTimers, come descritto nella documentazione Fake Timers. Questo è perfetto dal momento che già utilizzo Sinon per scopi di derisione, e suppongo che abbia senso che la stessa Mocha non supporti questo dato che è più nel dominio di una libreria di derisione.

Ecco un esempio che impiega Mocha/Chai/Sinon:

var clock; 
beforeEach(function() { 
    clock = sinon.useFakeTimers(); 
}); 

afterEach(function() { 
    clock.restore(); 
}); 

it("should time out after 500 ms", function() { 
    var timedOut = false; 
    setTimeout(function() { 
     timedOut = true; 
    }, 500); 

    timedOut.should.be.false; 
    clock.tick(510); 
    timedOut.should.be.true; 
}); 
+0

perché il beforeeach e afterEach? – R01010010

+1

@Rimbuaj Per installare l'orologio simulato prima di ogni test e rimuoverlo in seguito? – aknuds1

+0

ma c'è solo un test ... ecco perché lo chiedo – R01010010

Problemi correlati