2013-06-27 30 views
10

Tôi có một ứng dụng REST được viết bằng NodeJS đang chạy trên Heroku. Tôi có thiết lập tập tin .env của tôi để phát triển địa phương và hoạt động tốt bất cứ khi nào tôi chạy quản đốc để phục vụ ứng dụng của mình tại địa phương. Ứng dụng này cũng chạy tốt khi triển khai nó vào máy chủ heroku của tôi.Mocha + Nodejs + Tệp Heroku .env

Tôi đang cố viết các bài kiểm tra đơn vị cho ứng dụng của mình bằng Mocha/Supertest/should/assert. Khi tôi chạy ứng dụng của mình thông qua Mocha, nó không tải lên tệp .env để nhận các biến môi trường của tôi - trong trường hợp của tôi, URL cho cơ sở dữ liệu PSQL. Kết quả là, tất cả các thử nghiệm của tôi liên quan đến thời gian chờ DB I/O.

Tôi đã tẩy sạch Internet để tìm giải pháp nhưng dường như tôi không thể tìm thấy bất kỳ điều gì hữu ích.

Dưới đây là một số mẫu mã:

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 

Và kết quả tôi nhận được từ đang chạy 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) 

Khi tôi thay thế process.env.DATABASE_URL bằng URL cục bộ PSQL được mã hóa của tôi, tất cả các kiểm tra đều được chuyển. Vì vậy, rõ ràng là tập tin .env không được đọc bởi mocha.

Tôi cũng đã thử truyền các vv env cho Mocha với ít thành công. Có ai biết một cách thích hợp để có Mocha đọc trong môi trường của tôi vars từ tập tin .env?

Trả lời

12

Các foreman gem (được viết bởi một kỹ sư Heroku, để làm cho nó dễ dàng để sử dụng .env tập tin và Procfiles trong phát triển như bạn sẽ sản xuất Heroku) có một lệnh chỉ cho mục đích này: run.

foreman run npm test < - hoặc tuy nhiên bạn kích hoạt thử nghiệm của mình.

Ngoài ra, dự án hiện tại của tôi ở đây là những gì chúng tôi làm:

  • chúng ta có một tập tin test.env chứa các biến và giá trị môi trường thích hợp để thử nghiệm, ở định dạng Unix export. Vì vậy, có, export DATABASE_URL=MY_DB_URL. Định dạng là một chút khác nhau, nhưng đó là một ít phiền toái chúng tôi thấy phù
  • Chúng tôi có một Makefile chứa các chỉ dẫn sau:
 
-include test.env 

test: 
    npm test 

Khi chúng ta muốn chạy các bài kiểm tra đối với dự án của chúng tôi, chúng tôi chỉ make test . Thực hiện sẽ tải lên tệp test.env, gán tất cả biến môi trường, sau đó chạy npm test cho chúng tôi.

+0

hoạt động này! Cảm ơn người đàn ông, nhiều đánh giá cao. – Gimli

2

Tôi không hoàn toàn chắc chắn, nhưng tôi không nghĩ bạn có thể làm cho mocha đọc tệp .env của bạn. Điều đó dường như cụ thể đối với quản đốc. Nếu định nghĩa biến môi trường của bạn là đồng bằng KEY = VALUE, thì tôi tin rằng một cái gì đó đơn giản như env $(cat .env) mocha sẽ làm. Nếu không, bạn có thể phải làm một số tiền xử lý đầu tiên bằng cách sử dụng sed/perl/etc.

0

Sau khi tìm kiếm trên Internet trong nhiều ngày, sau đây là một cái gì đó, đó là làm việc cho tôi:

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

Đó là Cần lưu ý rằng PATH=$(npm bin):$PATH được sử dụng như môi trường của tôi đã không thể tìm thấy mocha.

Các vấn đề liên quan