Файл Mocha + Nodejs + Heroku.env
У меня есть приложение REST, написанное в NodeJS, работающем на Heroku. У меня есть моя настройка файла .env для локальной разработки и отлично работает, когда я запускаю мастера для обслуживания моего приложения локально. Приложение также отлично работает, когда я развертываю его на сервере heroku.
Я пытаюсь написать модульные тесты для моего приложения с помощью Mocha/Supertest/should/assert. Когда я запускаю свое приложение через Mocha, он не загружает файл .env, чтобы получить переменные окружения - в моем случае - URL-адрес базы данных PSQL. В результате все мои тесты, связанные с тайм-аутом ввода-вывода DB.
Я искал Интернет для решения, но я не могу найти ничего полезного.
Вот пример кода:
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 в моей среде vars из файла .env?
Ответы
Ответ 1
драгоценный камень мастера (написан инженером Хероку, чтобы было проще использовать файлы .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
для нас.
Ответ 2
Я не совсем уверен, но я не думаю, что вы можете сделать mocha своим файлом .env. Это похоже на мастера. Если ваши определения переменных среды равны KEY = VALUE, то я считаю, что что-то простое, как env $(cat .env) mocha
. В противном случае вам, возможно, придется сначала выполнить предварительную обработку, используя sed/perl/etc.
Ответ 3
После поиска в Интернете в течение нескольких дней следуя чему-то, что работает для меня:
> PATH=$(npm bin):$PATH env $(cat .env) mocha
Следует отметить, что PATH=$(npm bin):$PATH
используется, поскольку моя среда не могла найти mocha
.