我有一个在Heroku上运行的NodeJS编写的REST应用程序。我有本地开发的.env文件设置,每当我运行foreman在本地提供我的应用程序时,它都能正常工作。当我将它部署到我的heroku服务器时,该应用程序也运行良好。
我正在尝试使用Mocha / Supertest / should / assert为我的应用编写单元测试。当我通过Mocha运行我的应用程序时,它不会加载.env文件来获取我的环境变量 - 在我的例子中,是PSQL数据库的URL。结果,我的所有测试都涉及DB I / O超时。
我一直在寻找解决方案的互联网,但我似乎找不到任何有用的东西。
以下是一些示例代码:
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本地URL替换process.env.DATABASE_URL
时,测试全部通过。所以很明显mocha没有读取.env文件。
我也尝试过将env vars传递给Mocha,但收效甚微。有没有人知道在我的环境中使用.env文件读取Mocha的正确方法?
答案 0 :(得分:12)
foreman gem(由Heroku工程师编写,以便在开发中使用.env
文件和Procfiles
,就像在Heroku制作中一样)有一个仅用于此目的的命令:run
。
foreman run npm test
&lt; - 或者您触发测试。
或者,在我目前的项目中,这是我们的工作:
export
格式。所以,是的,export DATABASE_URL=MY_DB_URL
。格式有点不同,但这对我们来说很烦人-include test.env test: npm test
当我们想要为我们的项目运行测试时,我们只需make test
。 Make将加载test.env
文件,分配所有环境变量,然后为我们运行npm test
。
答案 1 :(得分:2)
我不完全确定,但我认为你不能让摩卡读你的.env文件。这似乎是工头特有的。如果您的环境变量定义是普通的KEY = VALUE,那么我相信像env $(cat .env) mocha
这样简单的事情。否则,您可能必须首先使用sed / perl / etc进行一些预处理。
答案 2 :(得分:0)
在互联网上搜索了好几天后,以下是为我工作的事情:
> PATH=$(npm bin):$PATH env $(cat .env) mocha
需要注意的是PATH=$(npm bin):$PATH
用于我的环境无法找到mocha
。