web-dev-qa-db-fra.com

Exécuter des tests mocha dans un environnement de test?

Je n'arrive pas à dire à mocha d'exécuter ma suite de tests dans l'environnement de test.

app.js

app.configure('test', function(){
  app.set('port', 3002);
});

test/some-test.coffee

app = require('../../app')

process.env.NODE_ENV = 'test'

describe 'some test', ->
  it 'should pass', ->

Étant donné que j'ai besoin d'une application, lorsque j'exécute les tests, je m'attends à voir

Express server listening on port 3002

et à la place je vois

Express server listening on port 3000

La définition d'un numéro de port différent dans un bloc de configuration de développement dans app.js donne

Express server listening on port [whatever port I set in development block in app.js]

Je ne peux pas faire exécuter mes tests dans un environnement de test. Aucune suggestion?

21
Feech
  1. Vous devez définir NODE_ENV avant d'exiger app.js:

    process.env.NODE_ENV = 'test'
    
    app = require('../../app')
    
    describe 'some test', ->
      it 'should pass', ->
    
  2. Vous ne pouvez pas modifier le port d'écoute par app.set. Il n'y a qu'une seule façon de définir le port - passez-le dans la méthode listen. Vous pouvez faire quelque chose comme ça:

    var express = require('express');
    var app = express();
    
    app.get('/', function(req, res){
      res.send('hello world');
    });
    
    var port = 3000;
    
    app.configure('test', function(){
      port = 3002;
    });
    
    app.listen(port);
    
36
Vadim Baryshev

Je prendrais une approche différente de Vadim. En utilisant l'exemple de Vadim, vous pouvez plutôt charger les paramètres d'environnement en fonction de votre process.env.NODE_ENV valeur. Je sais qu'il y a une autre étape dans mon approche, mais elle est plus propre, extensible et empêchera l'ajout de conditions de test dans votre logique.

Cette approche utilise dotenv , puis définit à la fois un fichier d'environnement default et test à la racine de l'application. Ces fichiers vous permettront de reconfigurer les propriétés de votre application sans changer votre JavaScript.

  1. Ajoutez dotenv en tant que dependency dans votre package.json fichier puis installez les nouveaux packages dans votre node_modules dossier:

    package.json

    {
      ...
      "dependencies": {
        ...
        "dotenv": "0.2.8"
      }
    }
    

    ligne de commande

    $ npm install
    
  2. Change ton app.js pour que le port utilise une valeur d'environnement définie à partir du fichier .env chargé.

    // Load .env files from root based on the NODE_ENV value
    require('dotenv').load();
    
    var express = require('express');
    var app = express();
    
    app.get('/', function(req, res){
      res.send('hello world');
    });
    
    var port = process.env.port || 3000;
    -----------^
    
    app.listen(port);
    
  3. Créez deux fichiers dans la racine de votre dossier, .env & .env.test, ajoutez simplement une ligne ci-dessous. Ces fichiers ont des paires clé-valeur simples sur chaque ligne auxquelles on peut accéder en préfixant process.env..

    . env

    port=3000
    

    . test.env

    port=3002
    
  4. À partir de la ligne de commande ou lorsque vous appelez vos tests, je définirais NODE_ENV:

    $ NODE_ENV=test mocha <TEST_FOLDER>/*.js
      ---------^
    

Lorsque vous exécutez l'application dans tous les autres cas sans définir NODE_ENV, les valeurs par défaut .env le fichier sera chargé dans process.env.

23
Eat at Joes