2012-09-02 9 views
16

Parece que no puedo decirle a mocha que ejecute mi suite de pruebas en el entorno de prueba.Ejecutar pruebas de moka en el entorno de prueba?

app.js

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

prueba/some-test.coffee

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

process.env.NODE_ENV = 'test' 

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

Desde que estoy requiriendo aplicación, cuando corro las pruebas que esperar para ver

Express server listening on port 3002

y en su lugar veo

Express server listening on port 3000

El establecimiento de un número de puerto diferente en un bloque de configuración en el desarrollo app.js produce

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

no puedo conseguir mis pruebas se ejecuten en un entorno de prueba . ¿Alguna sugerencia?

Respuesta

25
  1. es necesario definir NODE_ENV antes de que necesite app.js:

    process.env.NODE_ENV = 'test' 
    
    app = require('../../app') 
    
    describe 'some test', -> 
        it 'should pass', -> 
    
  2. No es posible cambiar el puerto de escucha por app.set. Solo hay una forma de establecer el puerto: pasarlo al método listen. Se puede hacer algo como esto:

    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); 
    
+0

Gracias, el punto n. ° 1 fue la solución. Sin embargo, puedo usar 'app.set ('port', [port])' en las configuraciones de entorno y pasar 'app.get ('port')' a la función 'listen'. De hecho, express (3.0.0rc3) hace esto al generar app.js. ¡Gracias de nuevo! – Feech

20

me tomaría un enfoque diferente de Vadim. Usando el ejemplo de Vadim, en su lugar podría cargar configuraciones de entorno basadas en su valor process.env.NODE_ENV. Sé que hay otro paso en mi enfoque, pero es más limpio, extensible, y evitará la adición de condicionales de prueba en su lógica.

Este enfoque usa dotenv, y luego define un archivo de entorno default y test en la raíz de la aplicación. Estos archivos le permitirán reconfigurar propiedades dentro de su aplicación sin cambiar su JavaScript.

  1. Añadir dotenv como dependency en su archivo package.json luego instalar los nuevos paquetes en su node_modules carpeta:

    package.json

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

    línea de comandos

    $ npm install 
    
  2. Cambie su app.js para que el puerto utilice un valor de entorno establecido desde el archivo .env cargado.

    // 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. Cree dos archivos en la carpeta raíz, .env & .env.test, sólo tiene que añadir la siguiente línea. Estos archivos tienen pares de valores clave simples en cada línea a los que se puede acceder con el prefijo process.env..

    .env

    port=3000 
    

    .env.test

    port=3002 
    
  4. Desde la línea de comandos o cuando se llama a las pruebas me gustaría establecer NODE_ENV:

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

Cuando ejecuta la aplicación en todos los demás casos sin establecer NODE_ENV, los valores en el archivo predeterminado .env se cargarán en process.env.

+0

Para el paso 4 terminé teniendo el .env de producción en la carpeta raíz de la aplicación y otro .env en mi prueba/carpeta. Luego, en mis scripts de prueba, le digo explícitamente a dotenv que use el archivo de prueba/.env usando el método de ruta de ubicación personalizada de dotenv. –

+0

FYI - a partir de dotenv 1.0, extrajeron la capacidad de cargar archivos .env de nombre (.env.test, .env.produduction, ...) utilizando el valor de NODE_ENV. –

+0

No es un problema, para la última versión, haga algo como require ('dotenv'). Config ({ruta: '.env. $ {Process.env.NODE_ENV}', silent: true}); – Eugene

Cuestiones relacionadas