2013-06-27 80 views
10

我有一個在Heroku上運行的NodeJS中編寫的REST應用程序。我有我的.env文件設置爲本地開發和工作正常,每當我運行領班在本地服務我的應用程序。當我將它部署到我的heroku服務器時,該應用程序也運行良好。摩卡+ Nodejs + Heroku .env文件

我正在嘗試爲我的應用程序使用Mocha/Supertest/should/assert編寫單元測試。當我通過Mocha運行我的應用程序時,它不會加載.env文件來獲取我的環境變量 - 在我的情況下是PSQL數據庫的URL。因此,我所有的測試都涉及數據庫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,測試全部通過。所以很明顯,.env文件沒有被mocha讀取。

我也嘗試將env vars傳給摩卡,但收效甚微。有沒有人知道一個正確的方法讓摩卡在我的環境變量中讀取.env文件中的變量?

回答

12

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

+0

這工作!謝謝你,非常感謝。 – Gimli

2

我不完全確定,但我不認爲你可以讓摩卡讀取你的.env文件。這似乎是工頭特有的。如果你的環境變量定義是普通的KEY = VALUE,那麼我相信像env $(cat .env) mocha那樣簡單。否則,您可能必須先使用sed/perl/etc進行一些預處理。

0

搜索互聯網爲天,下後的東西,這是爲我工作:

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

應當指出的是,PATH=$(npm bin):$PATH作爲我的環境是不是能找到mocha