摩卡+ Nodejs + Heroku .env文件

我在Heroku上运行的NodeJS上有一个REST应用程序。 我有我的.env文件设置为本地开发和工作正常,每当我运行领class在本地服务我的应用程序。 当我将它部署到我的heroku服务器时,该应用程序也运行良好。

我正在尝试使用Mocha / Supertest / should / assert为我的应用编写unit testing。 当我通过Mocha运行我的应用程序时,它不会加载.env文件来获取我的环境variables – 在我的情况下是PSQL数据库的URL。 因此,我所有涉及数据库I / O超时的testing。

我一直在互联网search解决scheme,但我似乎无法find有用的东西。

这是一些示例代码:

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) 

当我用我的硬编码PSQL本地URLreplaceprocess.env.DATABASE_URL时,testing全部通过。 所以很明显,.env文件没有被摩卡读取。

我也尝试过将env vars传给摩卡,但收效甚微。 有谁知道有一个正确的方法让摩卡在.env文件中读取我的环境variables?

工头的gem (由Heroku工程师编写,为了便于在开发中使用.env文件和Procfiles ,就像在Heroku生产中一样)有一个命令就是为了这个目的: run

foreman run npm test < – 或者你触发你的testing。

或者,在我目前的项目中,我们做的是:

  • 我们有一个包含适合testing的环境variables和值的test.env文件,采用Unix export格式。 所以,是的, export DATABASE_URL=MY_DB_URL 。 格式有点不同,但这是一个烦恼,我们可以
  • 我们有一个包含以下指令的Makefile:
 -include test.env

testing:
     npmtesting

当我们想为我们的项目运行testing时,我们只是make test 。 Make会载入test.env文件,分配所有的环境variables,然后运行npm test

我不完全确定,但我不认为你可以让摩卡阅读你的.env文件。 这似乎是工头特有的。 如果你的环境variables定义是普通的KEY = VALUE,那么我相信env $(cat .env) mocha会这么简单。 否则,您可能需要先使用sed / perl / etc进行一些预处理。

search了几天的互联网后,下面是一些东西,这对我很有用:

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

需要注意的是, PATH=$(npm bin):$PATH用于我的环境无法findmocha