10

我有一个在 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 在我的环境变量中读取的正确方法?

4

3 回答 3

14

foreman gem(由 Heroku 工程师编写,使文件和开发中的使用变得容易,就像.envProcfilesHeroku 生产中一样)有一个专门用于此目的的命令:run.

foreman run npm test<-- 或者你触发你的测试。

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

  • 我们有一个 test.env 文件,其中包含适用于测试的环境变量和值,采用 Unixexport格式。所以,是的,export DATABASE_URL=MY_DB_URL。格式有点不同,但这是我们可以接受的烦恼
  • 我们有一个包含以下指令的 Makefile:
-包括 test.env

测试:
    npm 测试

当我们想为我们的项目运行测试时,我们只需make test. Make 将加载test.env文件,分配所有环境变量,然后npm test为我们运行。

于 2013-06-28T03:01:05.587 回答
2

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

于 2013-06-28T01:07:30.813 回答
0

在互联网上搜索了几天后,以下是对我有用的东西:

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

需要注意的PATH=$(npm bin):$PATH是,由于我的环境无法找到mocha

于 2017-04-11T18:35:37.430 回答