Comment spécifier le répertoire de test pour mocha?

219

Mocha essaie de trouver des fichiers de test sous testpar défaut, comment puis-je spécifier un autre répertoire, par exemple server-test?

Freewind
la source
Bien que ce ne soit pas une réponse à 100% à votre question, consultez jaketrent.com/post/run-single-mocha-test - Je suis venu ici pour savoir comment exécuter une suite de tests spécifique et cela montre que vous pouvez utiliser .onlyet .skipgérer les tests que vous sont en train de courir. Important lors du développement d'une fonctionnalité spécifique lorsque vous ne voulez pas attendre que toute la suite de tests s'exécute en permanence.
Dave Sag

Réponses:

141

Modifier: cette option est déconseillée: https://mochajs.org/#mochaopts


Si vous voulez le faire en exécutant toujours simplement mochasur la ligne de commande, mais que vous vouliez exécuter les tests dans un dossier ./server-testsau lieu de ./test, créez un fichier ./test/mocha.optsavec juste ceci dans le fichier:

server-tests

Si vous souhaitez tout exécuter dans ce dossier et sous-répertoires, placez-le dans test/mocha.opts

server-tests
--recursive

mocha.opts sont les arguments transmis via la ligne de commande, donc faire de la première ligne uniquement le répertoire dont vous souhaitez modifier les tests redirigera ./test/

Jeff Dickey
la source
12
C'est l'option avec le moins de friction, et devrait être la réponse acceptée IMHO
Nick Tomlin
J'utilise l'une des plaques de la chaudière et à la ligne suivante, peut-être à cause des fenêtres, pouvez-vous vérifier une fois. node ./node_modules/mocha/bin/mocha $ (find api -name '* -test.js') --compilers js: babel-core / register
kobe
1
un joyau, joue également bien avec les configurations de débogage Webstorm IDE mocha, sélectionnez simplement "modèles de fichier" et laissez l'entrée vide, et il utilisera mocha.opts
danday74
3
C'est à coup sûr la meilleure réponse. Il vaudrait probablement la peine d'ajouter dans votre réponse également que le mocha.optsfichier peut être placé où vous le souhaitez, puis exécutez simplement en mochaspécifiant le chemin d'accès à son fichier de configuration par exemple:mocha --opts ./mocha.opts
quirimmo
1
vous pouvez aussi simplement mettre --recursive dans la ligne de commande mocha, utile si vous définissez le script de test dans votre package.json
unludo
282

Utilisez ceci:

mocha server-test

Ou si vous avez des sous-répertoires, utilisez ceci:

mocha "server-test/**/*.js"

Notez l'utilisation de guillemets doubles. Si vous les omettez, vous ne pourrez peut-être pas exécuter les tests dans les sous-répertoires.

Behrang
la source
1
Ça ne marche pas pour moi. Si je souhaite le faire de cette façon, je dois le fairemocha test/server-test
jonnie
22
Le problème des guillemets doubles m'avait depuis des lustres! Merci d'avoir sauvé ma raison. Criez à tous ceux qui lisent ceci de porter une attention particulière à ces doubles guillemets.
ctrlplusb
11
Dans mon cas, j'utilisais mocha ./**/*.test.js(donc je peux colocaliser le fichier de test avec le fichier de module). Le modèle a cessé de fonctionner pour moi lorsque j'ai ajouté un fichier de test à un niveau différent dans la hiérarchie des fichiers que les autres tests, et ne trouverait qu'un fichier de boule impair et pas la douzaine d'autres qui vivaient au même niveau dans la hiérarchie . L'emballage entre guillemets l'a corrigé.
Stoutie
1
ou utilisez simplement --recursivecomme je l'explique ci
Jeff Dickey
4
Ça devrait être la réponse! Les guillemets doubles me sauvent
Minh Thai
81

Voici une façon, si vous avez des sous-dossiers dans votre dossier de test, par exemple

/test
/test/server-test
/test/other-test

Ensuite, sous Linux, vous pouvez utiliser la commande find pour répertorier tous les fichiers * .js de manière récursive et les transmettre à mocha:

mocha $(find test -name '*.js')
250R
la source
29
ou utilisez simplement --recursivecomme je l'explique ci
Jeff Dickey
5
En d'autres termes, mochan'a-t-il aucune option pour définir la structure de répertoires souhaitée dans la configuration?
Vert
utilisateur client $ mocha $ (find tests -name '* .js') -bash: mocha: commande introuvable; Obtenir cette erreur.
lft93ryt
1
C'est trop compliqué et trompeur. Préférez les options mocha plutôt que d'utiliser une commande OS.
Michael Bushe
votre message ne répond pas à la question
ekkis
30

La bonne façon de le faire est d'ajouter un script npm "test" dans package.json qui appelle mocha avec les bons arguments. De cette façon, votre package.json décrit également votre structure de test. Cela évite également tous ces problèmes multiplateformes dans les autres réponses (guillemets doubles ou simples, "trouver", etc.)

Pour que mocha exécute tous les fichiers js du répertoire "test":

"scripts": {
    "start": "node ./bin/www", -- not required for tests, just here for context
    "test": "mocha test/**/*.js"
  },

Ensuite, pour exécuter uniquement les tests de fumée, appelez:

npm test

Vous pouvez normaliser l'exécution de tous les tests dans tous les projets de cette façon, donc lorsqu'un nouveau développeur démarre sur votre projet ou un autre, il sait que "npm test" exécutera les tests. Il y a une bonne préséance historique pour cela (Maven, par exemple, la plupart des projets de "vieille école" aussi). Cela aide certainement CI lorsque tous les projets ont la même commande de test.

De même, vous pouvez avoir un sous-ensemble de tests de fumée plus rapides que vous voudrez peut-être exécuter mocha:

"scripts": {
    "test": "mocha test/**/*.js"
    "smoketest": "mocha smoketest/**/*.js"
  },

Ensuite, pour exécuter uniquement les tests de fumée, appelez:

npm smoketest

Un autre modèle courant consiste à placer vos tests dans le même répertoire que la source qu'ils testent, mais appelez les fichiers de test * .spec.js. Par exemple: src / foo / foo.js est testé par src / foo / foo.spec.js.

Pour exécuter tous les tests nommés * .spec.js par convention:

  "scripts": {
    "test": "mocha **/*.spec.js"
  },

Ensuite, pour exécuter tous les tests, appelez:

npm test

Voir le motif ici? Bien. :) La cohérence bat Mura .

Michael Bushe
la source
C'est la façon la plus précise de le faire, je suppose.
ArturS
29

N'utilisez pas l'option -g ou --grep, ce modèle fonctionne sur le nom du test à l'intérieur de celui-ci (), pas sur le système de fichiers. La documentation actuelle est trompeuse et / ou carrément erronée à ce sujet. Pour limiter la commande entière à une partie du système de fichiers, vous pouvez passer un modèle comme dernier argument (ce n'est pas un indicateur).

Par exemple, cette commande définira votre reporter sur spec mais ne testera que les fichiers js immédiatement à l'intérieur du répertoire server-test:

mocha --reporter spec server-test/*.js

Cette commande fera la même chose que ci-dessus, plus elle exécutera uniquement les cas de test où la chaîne / définition it () d'un test commence par "Fnord:":

mocha --reporter spec --grep "Fnord:" server-test/*.js
gregtczap
la source
22

Si dans node.js , quelques nouvelles configurations à partir de Mocha v6 :

Option 1: créer .mocharc.jsondans le répertoire racine du projet:

{
  "spec": "path/to/test/files"
}

Option 2: ajouter une mochapropriété dans le projet package.json:

{
  ...

  "mocha": {
    "spec": "path/to/test/files"
  }
}

Plus d'options sont ici .

le champ
la source
20

Exécutez tous les fichiers dans les test_directorysous-répertoires qui correspondenttest.js

find ./parent_test_directory -name '*test.js' | xargs mocha -R spec

ou utilisez l' --recursiveinterrupteur

mocha --recursive test_directory/
Anthony Awuley
la source
11

J'ai eu ce problème tout à l'heure et l'ai résolu en supprimant l' --recursiveoption (que j'avais définie) et en utilisant la même structure suggérée ci-dessus:

mochify "test/unit/**/*.js"

Cela a exécuté tous les tests dans tous les répertoires sous /test/unit/pour moi tout en ignorant les autres répertoires dans/test/

jfunk
la source
9

Maintenant, en quelques jours (année 2020), vous pouvez gérer cela en utilisant le fichier de configuration mocha :

Étape 1: créer un fichier .mocharc.js à l' emplacement racine de votre application

Étape 2: Ajoutez le code ci-dessous dans le fichier de configuration mocha:

'use strict';

module.exports = {
  spec: 'src/app/**/*.test.js'
};

Pour plus d'options dans le fichier de configuration, reportez-vous à ce lien: https://github.com/mochajs/mocha/blob/master/example/config/.mocharc.js

rajeshchauhan23102008
la source
3

Je suis sur Windows 7 en utilisant node.js v0.10.0 et mocha v1.8.2 et npm v1.2.14. J'essayais juste d'obtenir du moka pour utiliser le test de chemin / unité pour trouver mes tests, Après avoir passé trop de temps et essayé plusieurs choses, j'ai atterri,

L'utilisation de l'option "test / unit / *. Js" ne fonctionne pas sous Windows. Pour de bonnes raisons, le shell Windows ne développe pas les caractères génériques comme Unixen.

Cependant, l'utilisation de "test / unit" fonctionne, sans le modèle de fichier. par exemple. "mocha test / unit" exécute tous les fichiers trouvés dans le dossier test / unit.

Cela n'exécute toujours qu'un fichier de dossiers en tant que tests, mais vous pouvez passer plusieurs noms de répertoire en tant que paramètres.

Pour exécuter un seul fichier de test, vous pouvez également spécifier le chemin d'accès complet et le nom du fichier. par exemple. "test mocha / unité / mytest1.js"

En fait, je configure dans package.json pour les "scripts" npm: {"test": "mocha test / unit"},

Donc, ce «test npm» exécute mes tests unitaires.

Robin Luiten
la source
11
À partir d'aujourd'hui, on peut utiliser l' --recursiveoption comme suit:mocha --recursive "some_dir"
superjos
3
Utilisation d' node_modules\.bin\mocha "test\unit\*.js"œuvres sous Windows. Fonctionne également node_modules\.bin\mocha "**\*.js"(mon cas réel). Mais je cherche un moyen d'exclure le répertoire node_modules . (J'utilise aussi gulpfile.js mais je dois parfois lancer le test directement avec mocha)
Alex 75
3

Si vous utilisez nodejs, dans votre package.jsonsousscripts

  1. Pour les global (-g)installations: "test": "mocha server-test"ou"test": "mocha server-test/**/*.js"pour les sous-documents
  2. Pour les projectinstallations: "test": "node_modules/mocha/bin/mocha server-test"ou "test": "node_modules/mocha/bin/mocha server-test/**/*.js"pour les sous-documents

Ensuite, exécutez vos tests normalement comme npm test

Cozzbie
la source
Je trouve que cela npm run mocha "./test/*.spec.js!(~)"ignore l'argument glob, mais node_modules/.bin/mocha "./test/*.spec.js!(~)"non.
ironchicken
@ironchicken pour passer des arguments à partir de "npm run" use - as innpm run mocha -- yourArgs
Pedro A
3

Comme mentionné par @superjos dans les commentaires, utilisez

mocha --recursive "some_dir"

avck
la source
2

Cela ne semble pas être un support "facile" pour changer de répertoire de test.
Cependant, vous devriez peut-être jeter un œil à ce problème , par rapport à votre question.

Pierre
la source
2

Comme l'a suggéré @ jeff-dickey, à la racine de votre projet, créez un dossier appelé test. Dans ce dossier, créez un fichier appelé mocha.opts. Maintenant, lorsque j'essaie d'améliorer la réponse de Jeff, ce qui a fonctionné pour moi, au lieu de spécifier le nom d'un seul dossier de test, j'ai spécifié un modèle pour trouver tous les tests à exécuter dans mon projet en ajoutant cette ligne:

*/tests/*.js --recursive dans mocha.opts

Si vous souhaitez plutôt spécifier les dossiers exacts dans lesquels rechercher les tests, j'ai fait quelque chose comme ceci:

shared/tests/*.js --recursive
server/tests/graph/*.js --recursive

J'espère que cela aide quiconque a besoin de plus que ce que les autres réponses fournissent

lwdthe1
la source