2017-06-26 1 views
2

J'ai donc un React composant qui définit un intervalle comme ceci:Comment vérifier que clearInterval a été appelé avec sinon?

componentDidMount() { 
    this.interval = window.setInterval(this.myFunction, 500); 
} 

Et à la fin de son exécution, myFunction tue l'intervalle en appelant clearInterval(this.interval);

J'utilise impressionnant de Sinon Fake Timer API pour faire que myFunction est appelé après 500 ms comme ceci:

let clock; 

beforeEach(() => { 
    clock = sinon.useFakeTimers(); 
}); 

... 

it('should call my function',() => { 
    clock.tick(510); 

    expect(myFunction).to.have.been.called; 
}); 

Mais je veux également vous assurer que la minuterie est terminée. Y at-il un moyen de vérifier clearInterval a été appelé?

Je l'ai essayé en utilisant expect(window.clearInterval).to.have.been.called; mais pas de chance, j'ai reçu un message d'erreur à la place. En outre, les docs de Sinon ne disent rien sur la façon de fournir un talon à clearInterval.

Merci beaucoup!

+0

En supposant que vous puissiez tester si 'clearInterval()' a été appelé, comment sauriez-vous combien de temps attendre avant de tester cela? Par exemple, comment sauriez-vous combien de fois la fonction a fonctionné avant de décider d'appeler 'clearInterval()'? – nnnnnn

+0

@nnnnnn Je n'aurais pas vraiment besoin d'attendre, car l'intervalle était supposé avoir été effacé à la fin de 'myFunction'. Donc, si 'myFunction' avait été appelé, je devrais être capable de dire avec certitude que l'intervalle avait été terminé. – felipecao

+0

Si l'intervalle est toujours effacé par 'myFunction()' la première fois qu'il est appelé alors cela n'a pas vraiment de sens d'utiliser 'setInterval()' du tout: vous devriez utiliser 'setTimeout()'. – nnnnnn

Répondre

1

Je suis parti avec une approche différente. Au lieu de vérifier si l'intervalle avait été effacé, j'ai changé mon test de cocher deux fois et assurez-vous myFunction a été appelée une seule fois, comme ceci:

it('should call my function',() => { 
    clock.tick(510); 

    // the interval should have been cleared the first time the clock ticked 
    clock.tick(510); 

    // given that the interval should have been cleared, 
    // myFunction shouldn't have been called more than once 
    expect(myFunction).to.have.been.calledOnce; 
}); 

Merci beaucoup pour l'aide, tout le monde! :)