我有一个在 Heroku 上运行的用 NodeJS 编写的 REST 应用程序。我为本地开发设置了 .env 文件,并且每当我运行工头在本地为我的应用程序提供服务时都可以正常工作。当我将它部署到我的 heroku 服务器时,该应用程序也运行良好。
我正在尝试使用 Mocha/Supertest/should/assert 为我的应用程序编写单元测试。当我通过 Mocha 运行我的应用程序时,它不会加载 .env 文件来获取我的环境变量——在我的例子中,是 PSQL 数据库的 URL。结果,我所有涉及 DB I/O 超时的测试。
我一直在互联网上寻找解决方案,但似乎找不到任何有用的东西。
这是一些示例代码:
应用程序.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;
用户测试.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 文件没有被 mocha 读取。
我也尝试将环境变量传递给 Mocha,但收效甚微。有谁知道从 .env 文件中让 Mocha 在我的环境变量中读取的正确方法?