web-dev-qa-db-fra.com

Faites moka attendre avant de lancer le prochain test

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!

11
R.A. Lucas

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);
 });
16
Flops

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.

9
Zlatko

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.

1
Emre Tapcı

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);
0
Jeff Lowery

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)

0
ymz