2012-09-02 20 views
16

Nie mogę powiedzieć, że mocha uruchamia mój pakiet testowy w środowisku testowym.Uruchamiaj testy mokka w środowisku testowym?

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', -> 

Odkąd jestem wymagających aplikacji, podczas uruchamiania testów spodziewam się zobaczyć

Express server listening on port 3002

i zamiast widzę

Express server listening on port 3000

Ustawianie inny numer portu w bloku konfiguracyjnym rozwoju w app.js daje

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

nie mogę dostać moje testy do uruchomienia w środowisku testowym . Jakieś sugestie?

Odpowiedz

25
  1. Trzeba zdefiniować NODE_ENV zanim wymagają app.js:

    process.env.NODE_ENV = 'test' 
    
    app = require('../../app') 
    
    describe 'some test', -> 
        it 'should pass', -> 
    
  2. Nie można zmienić port nasłuchiwania przez app.set. Istnieje tylko jeden sposób ustawienia portu - przekazanie go do metody listen. Można zrobić coś takiego:

    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

Dzięki, punkt # 1 był rozwiązaniem. Mogę jednak użyć 'app.set ('port', [port])' w konfiguracjach środowiska i przekazać 'app.get ('port')' do funkcji 'listen'. W rzeczywistości express (3.0.0rc3) robi to podczas generowania app.js. Dzięki jeszcze raz! – Feech

20

wziąłbym inne podejście Vadima. Korzystając z przykładu Vadima, można zamiast tego załadować ustawienia środowiska na podstawie wartości process.env.NODE_ENV. Wiem, że jest inny krok w moim podejściu, ale jest on czystszy, rozszerzalny i uniemożliwi dodanie warunków testowych do twojej logiki.

To podejście wykorzystuje dotenv, a następnie definiuje plik środowiska default i test w katalogu głównym aplikacji. Pliki te pozwolą Ci przekonfigurować właściwości w twojej aplikacji bez zmiany JavaScript.

  1. Dodaj dotenv jako dependency w pliku package.json następnie zainstalować nowe pakiety do folderu node_modules:

    package.json

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

    wiersza poleceń

    $ npm install 
    
  2. Zmień swój app.js, aby port używał wartości środowiska ustawionej z załadowanego pliku .env.

    // 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. Utwórz dwa pliki w katalogu głównym folderze .env & .env.test, wystarczy dodać jedną linię poniżej. Pliki te mają proste pary wartości kluczy w każdym wierszu, do których można uzyskać dostęp po dodaniu prefiksu process.env..

    .env

    port=3000 
    

    .env.test

    port=3002 
    
  4. Z linii poleceń lub jeśli zadzwonić do testów chciałbym ustawić NODE_ENV:

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

Po uruchomieniu aplikacji we wszystkich innych przypadkach bez ustawienia NODE_ENV, wartości w domyślnym pliku .env zostaną załadowane do process.env.

+0

Dla kroku 4 skończyłem właśnie o produkcji .env w folderze głównym aplikacji i innym .env w moim teście/folderze. Następnie w moich skryptach testowych wyraźnie informuję firmę dotenv o użyciu pliku test/.env przy użyciu metody niestandardowej ścieżki dotenv. –

+0

FYI - od dnia dotenv 1.0 szarpnęli możliwość wczytania nazw plików .env (.env.test, .env.produduction, ...) za pomocą wartości z NODE_ENV. –

+0

To nie jest problem, w najnowszej wersji coś w stylu require ('dotenv'). Config ({ścieżka: '.env. $ {Process.env.NODE_ENV}', silence: true}); – Eugene

Powiązane problemy