Mocha + Nodejs + Heroku .env 文件

10

我有一个使用NodeJS编写的REST应用程序正在Heroku上运行。我已经为本地开发设置了.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)

当我将process.env.DATABASE_URL替换为我硬编码的PSQL本地URL时,所有测试都通过了。所以很明显,mocha没有读取.env文件。

我也尝试过向Mocha传递环境变量,但效果不佳。请问有没有正确的方法让Mocha从.env文件中读取我的环境变量?

3个回答

14

Foreman 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


2

我不是完全确定,但我认为你不能让mocha读取你的.env文件。这似乎是特定于foreman的。如果您的环境变量定义是简单的KEY=VALUE,那么我相信像env $(cat .env) mocha这样简单的命令就可以了。否则,您可能需要先使用sed/perl等进行一些预处理。


0
经过数天的互联网搜索,我找到了以下代码,它对我有效: > PATH=$(npm bin):$PATH env $(cat .env) mocha 需要注意的是,PATH=$(npm bin):$PATH 用于解决我的环境无法找到 mocha 的问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接