2013-06-27 24 views
10

私は、Heroku上で動作するNodeJSで書かれたRESTアプリケーションを持っています。ローカル開発用の.envファイルをセットアップして、私がローカルに自分のアプリケーションを提供する上司を実行するたびに正常に動作します。私はherokuサーバーに展開するとアプリも正常に動作します。Mocha + Nodejs + Heroku .envファイル

私はMocha/Supertest/should/assertで私のアプリの単体テストを書こうとしています。私がMochaを使ってアプリケーションを実行すると、環境変数 - 私の場合はPSQLデータベースのURLを取得するために.envファイルがロードされません。結果として、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を交換してください。したがって、.envファイルがmochaによって読み取られていないことは明らかです。

私はまた、ほとんど成功していないモカにenvヴァールを渡そうとしました。誰でも、私の環境変数で.envファイルからMochaを読み込む適切な方法を知っていますか?

答えて

12

foreman gemは(あなたがHerokuの生産上と同じように、開発に.envファイルとProcfilesを使用することを容易にするために、Herokuのエンジニアによって書かれた)だけで、この目的のためのコマンドがあります。

foreman run npm test < - またはテストをトリガーします。私の現在のプロジェクトの代わりに

は、ここで我々は何をすべきかです:

  • 我々はUnixのexport形式で、テストのための適切な環境変数と値を含むtest.envファイルを持っています。だから、はい、export DATABASE_URL=MY_DB_URL。フォーマットは少し異なっているが、それは我々がMakefileを含む以下のディレクティブを持って、我々は
  • でOKだ迷惑だ:
     
    -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を使っていくつかの前処理をしなければならないかもしれません。 run

0

日間、インターネットを検索した後、次はそれが私のために働いて、何かある:

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

それは私の環境はmochaを見つけることができなかったとしてPATH=$(npm bin):$PATHが使用されていることに留意すべきです。

関連する問題