Comment augmenter le délai d'expiration pour un seul cas de test dans Mocha

405

Je soumets une demande de réseau dans un cas de test, mais cela prend parfois plus de 2 secondes (le délai par défaut).

Comment puis-je augmenter le délai d'expiration pour un seul cas de test?

Mahendra S
la source

Réponses:

669

C'est parti : http://mochajs.org/#test-level

it('accesses the network', function(done){
  this.timeout(500);
  [Put network code here, with done() in the callback]
})

Pour la fonction flèche, utilisez comme suit:

it('accesses the network', (done) => {
  [Put network code here, with done() in the callback]
}).timeout(500);
Dan Kohn
la source
23
le délai d'expiration est en millisecondes, et il est par défaut de 2000.
Ethan Mick
47
J'utilisais les fonctions fléchées es6 et je devais revenir aux anciennes définitions de «fonction» pour que «ceci» fonctionne.
Aruna Herath
1
Fonctionne également pour les crochets, commebefore(function(done){this.timeout(5 * 1000);...});
JP
2
@AH La raison pour laquelle la fonction flèche n'a pas fonctionné est à cause de ce lexical
Tanner Faulkner
11
existe-t-il un moyen de le faire fonctionner avec la fonction flèche? modifier: ajouter .timeout(500)à la fin deit(...).timeout(500)
chovy
136

Si vous souhaitez utiliser les fonctions fléchées es6, vous pouvez ajouter un .timeout(ms)à la fin de votre itdéfinition:

it('should not timeout', (done) => {
    doLongThing().then(() => {
        done();
    });
}).timeout(5000);

Au moins, cela fonctionne dans Typescript.

Chris Sparrow
la source
3
Cela fonctionne, mais .timeoutn'est pas inclus dans les typages DefinitelyTyped pour mocha: i.imgur.com/jQbWCn1.png - L'utilisation this.timeout(2000)ou this.slow(500)avec une ancienne fonction régulière fonctionne et se compile sans erreurs
Leon Adler
3
Malheureusement, cela ne fonctionne que pour it, cela ne fonctionne pas describe.
robrich
3
existe-t-il un moyen de le faire pour describe()ou context()?
chovy
1
@LeonAdler .timeoutest désormais inclus dans les typages de Mocha DefinitelyTyped à: Mocha.IRunnable. Cependant, si vous utilisez l'IDE Webstorm pour exécuter ces tests, une note de prudence: pour une raison quelconque, le plug-in d'intégration Mocha de WebStorm ne reconnaît toujours pas les tests Mocha avec .timeout()ajout (ce qui signifie qu'aucun bouton `` exécuter '' n'apparaît à côté d'eux), et donc je préconise d'éviter les fonctions fléchées pour permettre l'utilisation de à la this.timeout()place.
Jamie Birch du
C'est parfait. Pour la fonction asynchrone renvoyant une promesse, vous pouvez laisser de côté ().
billoverton
72

(depuis que j'ai rencontré ça aujourd'hui)

Soyez prudent lorsque vous utilisez la syntaxe de la flèche de gras ES2015:

Cela échouera:

it('accesses the network', done => {

  this.timeout(500); // will not work

  // *this* binding refers to parent function scope in fat arrow functions!
  // i.e. the *this* object of the describe function

  done();
});

EDIT: Pourquoi cela échoue:

Comme @atoth le mentionne dans les commentaires, les fonctions des flèches grasses n'ont pas leur propre cette liaison. Par conséquent, il n'est pas possible pour la fonction it de se lier à cela du rappel et de fournir une fonction de délai d'expiration .

Conclusion : n'utilisez pas les fonctions fléchées pour les fonctions qui nécessitent un délai d'expiration plus long.

chriskelly
la source
2
Parce que les fonctions fléchées ne l'ont pas du tout. En savoir plus ici: blog.getify.com/arrow-this
atoth
2
Oui, mais je l'ai expliqué dans la réponse. Voir mon commentaire. // à l'intérieur du code. Je devrais probablement l'expliquer en dehors du bloc de code pour le rendre plus clair. cela existe, mais cela vient de la portée extérieure.
chriskelly
1
Mon explication est plus précise. Il n'y a pas de thisliaison sur les fonctions fléchées - pas de la même manière ne suggérerait qu'elles ont une sorte de, juste différente. Ils n'ont que des portées lexicales. Vous ne pouvez pas lier cela non existant. C'est pourquoi .bind, .calletc. ne fonctionne pas avec.
atoth
1
C'est vrai - et à droite, c'est plus précis. Merci
chriskelly
1
Je dirais que c'est pourquoi vous ne devez utiliser des flèches grasses que lorsque vous en avez besoin, mais j'ai perdu la trace de ce qui thisest.
xdumaine
42

Si vous utilisez dans NodeJS, vous pouvez définir le délai d'expiration dans package.json

"test": "mocha --timeout 10000"

alors vous pouvez exécuter en utilisant npm comme:

npm test

la source
1
C'est pour tous les cas de test, pas un seul cas de test
garryp
Je suis d'accord que cela ne répond pas à la question, mais c'était suffisant pour mon cas d'utilisation où je m'en fichais si cela augmentait pour tous les tests. Je pense que beaucoup de gens qui se retrouvent ici peuvent ne pas se soucier si c'est pour un test ou tous, donc j'apprécie cette réponse ici.
billoverton
22

Depuis la ligne de commande:

mocha -t 100000 test.js
andrey
la source
14
Cela augmente le délai d' attente pour tous les cas de test plutôt que "pour un cas de test particulier" comme le demande la question.
Louis
16

Vous pouvez également penser à adopter une approche différente et à remplacer l'appel à la ressource réseau par un objet stub ou mock. En utilisant Sinon , vous pouvez dissocier l'application du service réseau, en concentrant vos efforts de développement.

David Souther
la source
7
Ce n'est pas totalement hors de propos; fréquemment, il est judicieux de bloquer la réponse du réseau afin que vous ne dépendiez pas de la machine en marche ou du retour de la réponse correcte. Si vous testez la réponse elle-même, alors oui, vous devez toujours le faire.
aendrew
2
J'utilise sinon / mocha pour construire des tests d'intégration, donc des délais d'attente plus élevés sont pertinents.
jcollum
9

Pour tester la non-négation sur Express:

const request = require('supertest');
const server = require('../bin/www');

describe('navegation', () => {
    it('login page', function(done) {
        this.timeout(4000);
        const timeOut = setTimeout(done, 3500);

        request(server)
            .get('/login')
            .expect(200)
            .then(res => {
                res.text.should.include('Login');
                clearTimeout(timeOut);
                done();
            })
            .catch(err => {
                console.log(this.test.fullTitle(), err);
                clearTimeout(timeOut);
                done(err);
            });
    });
});

Dans l'exemple, le temps de test est de 4000 (4 s).

Remarque: setTimeout(done, 3500)est mineur pour ce qui doneest appelé dans le temps du test mais clearTimeout(timeOut)il évite que utilisé tout ce temps.

aldite
la source
2

Cela a fonctionné pour moi! Impossible de trouver quoi que ce soit pour le faire fonctionner avant ()

describe("When in a long running test", () => {
  it("Should not time out with 2000ms", async () => {
    let service = new SomeService();
    let result = await service.callToLongRunningProcess();
    expect(result).to.be.true;
  }).timeout(10000); // Custom Timeout 
});
Otpidus
la source
.timeout () a parfaitement fonctionné!
acidjazz