Mocha + Nodejs + Heroku .env файл

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

Я пытаюсь написать модульные тесты для своего приложения с помощью 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 своим жестко запрограммированным локальным URL-адресом PSQL, все тесты проходят. Итак, ясно, что файл .env не читается мокко.

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


person Gimli    schedule 27.06.2013    source источник


Ответы (3)


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 для нас.

person RyanWilcox    schedule 28.06.2013

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

person happppy_user    schedule 28.06.2013

После нескольких дней поисков в Интернете я нашел следующее:

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

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

person Rajat Saxena    schedule 11.04.2017