2013-06-27 3 views
10

У меня есть приложение REST, написанное в NodeJS, работающем на Heroku. У меня есть моя настройка файла .env для локальной разработки и отлично работает, когда я запускаю мастера для обслуживания моего приложения локально. Приложение также отлично работает, когда я развертываю его на сервере heroku.Mocha + Nodejs + Heroku .env file

Я пытаюсь написать модульные тесты для моего приложения с помощью Mocha/Supertest/should/assert. Когда я запускаю свое приложение через Mocha, он не загружает файл .env, чтобы получить переменные окружения - в моем случае - URL-адрес базы данных PSQL. В результате все мои тесты, связанные с тайм-аутом ввода-вывода БД.

Я искал Интернет для решения, но я не могу найти ничего полезного.

Вот некоторые примеры кода:

app.js:

var application_root = __dirname, 
    express   = require("express"), 
    port    = process.env.PORT || 4482; 
    pg    = require('pg').native, 
    client   = new pg.Client(process.env.DATABASE_URL); 

// Connect To DB 
client.connect(); 

(...) 

app.get('/api', function (req, res) { 
    res.send('PS API is running'); 
}); 
app.get('/', function (req, res) { 
    res.send('PS API is running'); 
}); 

(...) 

// Read Users 
app.get('/users', function (req,res) { 
    user.readUsers(res,client); 
}); 

(...) 

// Launch server 
console.log('Listening on port: '+ port); 
app.listen(port); 
module.exports = app; 

userTest.js

var request = require('supertest'); 
var assert = require('assert'); 
var app  = require('app.js'); 
var should = require('should'); 

describe('Get /', function(){ 
    it('should respond OK',function(done){ 
     request(app) 
     .get('/') 
     .end(function(err, res){ 
      res.status.should.equal(200); 
      done(err); 
     }); 
    }); 
}); 

describe('Get /api', function(){ 
    it('should respond OK',function(done){ 
     request(app) 
     .get('/api') 
     .end(function(err, res){ 
      res.status.should.equal(200); 
      done(err); 
     }); 
    }); 
}); 

// Getting All Users 
describe('Get /users', function(){ 
    it('should respond OK',function(done){ 
     request(app) 
     .get('/users') 
     .end(function(err, res){ 
      res.status.should.equal(200); 
      done(err); 
     }); 
    }); 
}); 

.env

== LOCAL DB == 
DATABASE_URL=MY_DB_URL 
HEROKU_POSTGRESQL_GOLD_URL=MY_DB_URL 
PATH=bin:node_modules/.bin:/usr/local/bin:/usr/bin:/bin 

И выход я получаю от бег mocha test

Listening on port: 4482 

    ․․Getting all users 
․ 

    2 passing (2 seconds) 
    1 failing 

    1) Get /users should respond OK: 
    Error: timeout of 2000ms exceeded 
     at Object.<anonymous> (/usr/local/lib/node_modules/mocha/lib/runnable.js:165:14) 
     at Timer.list.ontimeout (timers.js:101:19) 

Когда я заменить process.env.DATABASE_URL с моим зашиты PSQL локального URL, тесты все проходят. Поэтому ясно, что файл .env не читается моккой.

Я также пробовал пропустить env vars в Mocha с небольшим успехом. Кто-нибудь знает о надлежащем способе чтения мокко в моем окружении vars из файла .env?

ответ

12

foreman gem (написанный инженером Heroku, чтобы сделать его легко использовать .env файлы и Procfiles в развитии, как на производстве Heroku) имеет команду для этой цели: run.

foreman run npm test < - или же вы запускаете свои тесты.

В качестве альтернативы, на мой текущий проект, вот что мы делаем:

  • у нас есть файл test.env, содержащий переменные окружения и значения подходят для тестирования, в формате Unix export. Итак, да, export DATABASE_URL=MY_DB_URL. Формат немного отличается, но это раздражение, мы все в порядке с
  • У нас есть Makefile, содержащий следующие директивы:
 
-include test.env 

test: 
    npm test 

Когда мы хотим запустить тесты для нашего проекта мы просто make test , Make загрузит файл test.env, назначит все переменные среды, а затем запустит npm test.

+0

это сработало! Спасибо, человек, очень ценится. – Gimli

2

Я не совсем уверен, но я не думаю, что вы можете сделать мокко читать ваш файл .env. Это похоже на мастера. Если ваши определения переменных среды равны KEY = VALUE, то я считаю, что что-то простое, как env $(cat .env) mocha. В противном случае вам, возможно, придется сначала выполнить предварительную обработку, используя sed/perl/etc.

0

После поиска в Интернете в течение нескольких дней, после что-то, что работает для меня:

> PATH=$(npm bin):$PATH env $(cat .env) mocha

Следует отметить, что PATH=$(npm bin):$PATH используется как моя среда не смогла найти mocha.