93 votes

Les tests Mocha avec des options ou des paramètres supplémentaires

Je rédige des cas de test pour mon application Node.js en utilisant Mocha. Les cas de test nécessitent une clé API en tant qu'option ou paramètre supplémentaire. La clé API est privée, donc je ne veux pas l'inclure directement dans les fichiers de test car tout le monde pourrait alors la voir sur GitHub. Je sais qu'il existe des options disponibles pour Mocha sur:

http://mochajs.org/#usage

Mais est-il possible d'inclure des paramètres permettant aux testeurs de spécifier leur propre clé API pour le test via la ligne de commande? Par exemple:

./node_modules/mocha/bin/mocha test/*.js --key VOTRE_CLÉ

91voto

robertklep Points 29669

Je ne pense pas que Mocha lui-même prend en charge le passage de paramètres supplémentaires à vos tests, mais vous pourriez utiliser des variables d'environnement :

env CLÉ=VOTRE_CLÉ mocha test/*.js # suppose un type de système d'exploitation de type Unix.

Et les lire dans vos fichiers de test :

var clé = process.env.CLÉ;

32voto

Noah Points 7066

Jetons un œil au module optimist de Substack et nconf de flatiron. Beaucoup de mes tests dépendent de paramètres externes et les modules optimist et nconf facilitent le chargement des options de configuration à partir d'un fichier json

Dans votre commande de test, passez le chemin du fichier config.json

commande de test

mocha test/api-test.js --config=/chemin/vers/config.json --reporter spec

api-test.js

var path = require('path')
var fs = require('fs')
var assert = require('assert')
var argv = require('optimist').demand('config').argv
var cheminFichierConfig = argv.config
assert.ok(fs.existsSync(cheminFichierConfig), 'fichier config non trouvé au chemin: ' + cheminFichierConfig)
var config = require('nconf').env().argv().file({file: cheminFichierConfig})
var apiConfig = config.get('api')
var cleApi = apiConfig.key

config.json

{
  "api": {
    "key": "fooKey",
    "host": "example.com",
    "port": 9000
  }
}

Alternative

Un autre motif que j'utilise récemment est le module config. Vous pouvez spécifier un fichier ./config/default.yml pour l'exécution régulière et un fichier ./config/test.yml pour les tests.

Lorsque vous exécutez votre suite de tests, exportez NODE_ENV=test et le module de configuration chargera test.yml

Il est facile d'accéder à l'objet de configuration dans votre code

var config = require('config')

// config contient maintenant vos valeurs de configuration actuelles telles que déterminées par process.env.NODE_ENV
var cleApi = config.api.key

Un moyen simple de définir NODE_ENV=test est d'exécuter vos tests avec un fichier makefile. Exécutez tous vos tests via make test. Pour exécuter un seul test, exécutez make one NAME=test/unit/sample-test.js

Exemple de makefile

MOCHA?=node_modules/.bin/mocha
REPORTER?=spec
GROWL?=--growl
FLAGS=$(GROWL) --reporter $(REPORTER) --colors --bail

test:
        @NODE_ENV="test" \
        $(MOCHA) $(shell find test -name "*-test.js") $(FLAGS)

one:
        @NODE_ENV="test" \
        $(MOCHA) $(NAME) $(FLAGS)

unit:
        @NODE_ENV="test" \
        $(MOCHA) $(shell find test/unit -name "*-test.js") $(FLAGS)

integration:
        @NODE_ENV="test" \
        $(MOCHA) $(shell find test/integration -name "*-test.js") $(FLAGS)

acceptance:
        @NODE_ENV="test" \
        $(MOCHA) $(shell find test/acceptance -name "*-test.js") $(FLAGS)

.PHONY: test

32voto

Adam Levine Points 321

Un des moyens les plus simples de passer des paramètres similaires à la méthode process.argv[index] mentionnée dans ce fil de discussion consiste à utiliser les variables de configuration npm. Cela vous permet de voir un peu plus clairement le nom de la variable :

commande de test :

npm --somevariable=myvalue run mytest

package.json :

"scripts": {
"mytest": "mocha ./test.js" }

test.js

console.log(process.env.npm_config_somevariable) // devrait évaluer à "myvalue"

27voto

danday74 Points 15895

Les autres réponses sont limitées car elles ne prennent pas en charge l'exécution du code avant l'exécution de votre suite de tests. Elles prennent seulement en charge le passage de paramètres.

Cette réponse prend en charge l'exécution du code AVANT l'exécution de votre suite de tests et est entièrement documentée par mocha

docs de mocha: http://unitjs.com/guide/mocha.html#mocha-opts

créer ./test/mocha.opts

--recursive
--reporter spec
--require ./server.bootstrap
--require ./test/test.bootstrap

créer ./server.bootstrap.js

global.appRoot = require('app-root-path');
// tout autre code d'initialisation du serveur

créer ./test/test.bootstrap.js

process.env.NODE_ENV='test';
// tout autre code d'initialisation spécifique aux tests

enfin dans votre server.js:

require('./server.bootstrap');

C'EST TERMINÉ!

Le code dans le bootstrap du serveur sera exécuté avant les tests et l'exécution du serveur (npm start et npm test)

Le code dans le bootstrap de test ne sera exécuté qu'avant les tests (npm test)

Merci à @damianfabian pour celui-ci - voir Comment initialiser une variable globale lors de l'exécution de tests unitaires?

20voto

Illniyar Points 867

Il n'y a pas de moyen officiel de le faire avec Mocha. La manière suggérée est d'utiliser un fichier (par exemple config.json), de le requérir et de laisser d'autres personnes le modifier.

Ceci étant dit, si vous passez votre clé à la fin de la ligne de commande (après le fichier à tester) et utilisez --, cela devrait être disponible en utilisant process.argv (si vous n'utilisez pas -- ou s'il n'est pas après un nom de fichier régulier, alors mocha échouera).

si vous exécutez ./node_modules/mocha/bin/mocha --reporter spec test.js --apiKey=someKey, et test.js contient le code :

var assert = require("assert")
describe("testy", function () {
    it("shouldy", function (done) {
        var value;
        for (var index in process.argv) {
            var str = process.argv[index];
            if (str.indexOf("--apiKey") == 0) {
                value = str.substr(9);
            }
        }
        assert.equal(value,"someKey")
        done();
    })
})

le test devrait réussir

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X