Vous avez des tests mocha qui nécessitent des données d'appels de fonction antérieurs, mais parce qu'ils utilisent un service Web et qu'ils voudraient attendre littéralement pendant une durée prédéterminée avant d'exécuter le test suivant, comme par exemple:
var global;
it('should give some info', function(done) {
run.someMethod(param, function(err, result) {
global = result.global
done();
});
});
wait(30000); // basically block it from running the next assertion
it('should give more info', function(done) {
run.anotherMethod(global, function(err, result) {
expect(result).to.be.an('object');
done();
});
});
Toute idée serait appréciée. Merci!
setTimeout pourrait certainement aider, mais il existe peut-être une méthode "plus propre" pour le faire . docs dit en fait d'utiliser this.timeout(delay)
pour éviter les erreurs de dépassement de délai lors du test du code async, alors soyez prudent.
var global;
it('should give some info', function(done) {
run.someMethod(param, function(err, result) {
global = result.global
done();
});
});
it('should give more info', function(done) {
this.timeout(30000);
setTimeout(function () {
run.anotherMethod(global, function(err, result) {
expect(result).to.be.an('object');
done();
});
}, 30000);
});
Alors que this.timeout()
prolongera le délai d’exécution d’un seul test, ce n’est pas la réponse à votre question. this.timeout()
définit le délai d’expiration de votre current test.
Mais ne vous inquiétez pas, ça devrait aller de toute façon. Les tests ne se déroulent pas en parallèle, ils se font en série, vous ne devriez donc pas avoir de problème avec votre approche globale.
Tout d'abord, pour des tests unitaires appropriés, vous ne devriez jamais avoir besoin de dormir entre les tests. Si vous avez besoin d'une mise en veille, cela signifie que les fonctions que vous testez nécessitent un délai avant la fin de la tâche attendue, qui doit être gérée dans cette fonction, avec une attente ou une mise en veille asynchrone. À la sortie d'une fonction, sa durée de vie doit se terminer et le résultat attendu doit être acquis immédiatement.
Voici un autre, en utilisant des promesses:
it('go, then stop', (done) => {
// this.skip();
go()
.then((response) => { console.log('go was called'); return response; })
.then(response => response.should.equal('acknowledged'))
.then(() => new Promise(resolve => setTimeout(() => { resolve(); }, 3000)))
.then(() => console.log('3 second wait is over'))
.then(() => stop())
.then(response => response.should.equal('acknowledged'))
.then(() => done());
}).timeout(15000);
Premier:
Ce fil a de bonnes réponses! J'ai personnellement aimé la réponse de @Flops (j'ai eu mon vote positif)
Seconde:
Pour clarifier ceci (autant que possible), voici un exemple de code très similaire à celui avec lequel je me suis retrouvé (testé et vérifié)
function delay(interval)
{
return it('should delay', done =>
{
setTimeout(() => done(), interval)
}).timeout(interval + 100) // The extra 100ms should guarantee the test will not fail due to exceeded timeout
}
it('should give some info', function(done) {
run.someMethod(param, function(err, result) {
global = result.global
done();
});
});
delay(1000)
it('should give more info', function(done) {
run.anotherMethod(global, function(err, result) {
expect(result).to.be.an('object');
done();
});
});
Remarque secondaire: vous pouvez également utiliser les fonctions de retard les unes après les autres tout en préservant la cohérence (ordre de test)