Modifier le délai d'expiration par défaut pour le moka

161

Si nous avons un fichier de test unitaire my-spec.js et fonctionnant avec mocha:

mocha my-spec.js

Le délai d'expiration par défaut sera de 2000 ms. Il peut être écrasé pour un test partiel avec un paramètre de ligne de commande:

mocha my-spec.js --timeout 5000

Est-il possible de modifier globalement le délai d'expiration par défaut pour tous les tests? c'est-à-dire que la valeur de timeout par défaut sera différente de 2000 ms lorsque vous appelez:

mocha my-spec.js
lm.
la source
Le site officiel de Mocha en explique également plus à ce sujet.
RaviRokkam

Réponses:

305

Par défaut, Mocha lit un fichier nommé test/mocha.optsqui peut contenir des arguments de ligne de commande. Vous pouvez donc créer un tel fichier contenant:

--timeout 5000

Chaque fois que vous exécutez Mocha sur la ligne de commande, il lira ce fichier et définira un délai d'expiration de 5 secondes par défaut.

Une autre façon qui peut être meilleure en fonction de votre situation est de le définir comme ceci dans un describeappel de niveau supérieur dans votre fichier de test:

describe("something", function () {
    this.timeout(5000); 

    // tests...
});

Cela vous permettrait de définir un délai d'expiration uniquement sur une base par fichier.

Vous pouvez utiliser les deux méthodes si vous voulez une valeur par défaut globale de 5000 mais définir quelque chose de différent pour certains fichiers.


Notez que vous ne pouvez généralement pas utiliser une fonction de flèche si vous allez appeler this.timeout(ou accéder à tout autre membre de thiscet ensemble Mocha pour vous). Par exemple, cela ne fonctionnera généralement pas :

describe("something", () => {
    this.timeout(5000); //will not work

    // tests...
});

C'est parce qu'une fonction de flèche prend thisde la portée dans laquelle la fonction apparaît. Mocha appellera la fonction avec une bonne valeur pour thismais cette valeur n'est pas passée à l'intérieur de la fonction de flèche. La documentation de Mocha dit à ce sujet :

Il est déconseillé de passer des fonctions fléchées («lambdas») à Mocha. En raison de la liaison lexicale de ceci, ces fonctions ne peuvent pas accéder au contexte Mocha.

Louis
la source
1
Merci pour l'information. Mais j'ai essayé de modifier le fichier mocha.opts, mais cela n'affecte pas.
lm.
2
L'avez-vous créé au bon endroit? Mocha est très précis quant à l'endroit où il veut ce fichier. Si vous exécutez Mocha, /home/me/src/proj/Mocha va rechercher ce fichier:/home/me/src/proj/test/mocha.opts
Louis
Merci beaucoup . Maintenant, le changement affecté
lm.
this.timeout (10000); // timeout par défaut ^ TypeError: this.timeout n'est pas une fonction de Suite. <anonymous> (/Users/jeff.l/Documents/workspace/unit-tests/mocha-chai_tests/checkoutTest.js:12:10)
Jeff Lowery
6
@JeffLowery Utilisez-vous une fonction fléchée? Les fonctions fléchées n'établissent pas de nouveau this, ce qui entraîne généralement un this.timeoutéchec comme vous le montrez dans votre commentaire.
Louis
62

En ajoutant simplement à la bonne réponse, vous pouvez définir le délai d'expiration avec la fonction de flèche comme ceci:

it('Some test', () => {

}).timeout(5000)
Denis
la source
7
La question est "de modifier globalement le délai par défaut pour tous les tests". Votre réponse ne change qu'un seul test. describe('suite', () => {...}).timeout(5000)ne fonctionne pas.
aleung
Comme dans la réponse précédente, la solution proposée est actuellement inefficace. mochajs.org/#timeouts dit d'insérer des setTimeoutinstructions explicites à l'intérieur des tests.
Marco Faustinelli
cela a fonctionné pour moi avec moka @ 5 (pour un test spécifique)
Fernando Gabrieli
@MarcoFaustinelli Vous ne comprenez pas la documentation. Les setTimeouts n'ont rien à voir avec Mocha. Ils sont là pour démontrer les effets des paramètres de délai d'attente.
oligofren
33

L'ajout de ceci pour l'exhaustivité. Si vous (comme moi) utilisez un script dans votre package.jsonfichier, ajoutez simplement l' --timeoutoption à mocha:

"scripts": {
  "test": "mocha 'test/**/*.js' --timeout 10000",
  "test-debug": "mocha --debug 'test/**/*.js' --timeout 10000"
},

Ensuite, vous pouvez exécuter npm run testvotre suite de tests avec le délai d'expiration défini sur 10 000 millisecondes.

Freedom_Ben
la source
Au cas où quelqu'un serait intéressé, la plupart des IDE vous permettent également d'injecter des options mocha pour l'exécution des tests; par exemple pour WebStorm, vous pouvez entrer ceci (c'est-à-dire "--timeout 10000") sous Exécuter-> Modifier les configurations-> Options Mocha supplémentaires.
Rubicon
25

Dans les versions actuelles de Mocha, le délai d'expiration peut être modifié globalement comme ceci:

mocha.timeout(5000);

Ajoutez simplement la ligne ci-dessus n'importe où dans votre suite de tests, de préférence en haut de vos spécifications ou dans un assistant de test séparé.


Dans les anciennes versions, et uniquement dans un navigateur, vous pouviez modifier la configuration globale à l'aide de mocha.setup.

mocha.setup({ timeout: 5000 });

La documentation ne couvre pas le paramètre de délai d'expiration global, mais offre quelques exemples sur la façon de modifier le délai d'expiration dans d'autres scénarios courants.

GOTO 0
la source
5
Cela ne fonctionne pas dans Node. Voir stackoverflow.com/a/47915119/893113 . Il semble que l'option CLI soit le seul moyen.
paulmelnikow
Je ne travaille pas non plus dans le navigateur. À ce jour, la documentation liée à la réponse ne mentionne aucun timeoutparamètre. Au contraire, mochajs.org/#timeouts dit d'insérer des setTimeoutinstructions explicites à l'intérieur des tests.
Marco Faustinelli
@MarcoFaustinelli Vous ne comprenez pas la documentation. Les setTimeouts n'ont rien à voir avec Mocha. Ils sont là pour démontrer les effets des paramètres de délai d'attente.
oligofren