web-dev-qa-db-fra.com

Comment puis-je simuler le passage du temps dans les tests Mocha pour que les rappels setTimeout soient appelés?

J'ai besoin de tester du code JavaScript qui repose sur setTimeout afin d'effectuer des tâches périodiques. Comment puis-je à partir de mes tests Mocha simuler le passage du temps afin que les rappels setTimeout soient appelés?

Je demande essentiellement des fonctionnalités similaires à Jasmine's Mock Clock , qui vous permet d'avancer le temps JavaScript d'un certain nombre de ticks.

37
aknuds1

J'ai découvert que Sinon.JS prend en charge la manipulation de l'horloge JavaScript, via sinon.useFakeTimers, comme décrit dans sa documentation Fake Timers . C'est parfait car j'utilise déjà Sinon à des fins de simulation, et je suppose qu'il est logique que Mocha lui-même ne le prenne pas en charge car il appartient davantage au domaine d'une bibliothèque de simulation.

Voici un exemple utilisant 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;
});
57
aknuds1