在单元测试期间更改dotenv变量

时间:2018-07-10 16:34:38

标签: node.js unit-testing express mocha supertest

我有一个.env文件,其中包含MYVAR=1变量。

server.js

//...   
var app = express();  
//... 
if(app.get("env")==="development"){
  require('dotenv').config();
}
console.log("server------",process.env. MYVAR) //outputs 1
if(process.env.MYVAR==1){
   //do this  
}
if(process.env.MYVAR==2){
   //do this 
}
module.exports = app;

test.server.js

app = require('../server'),
supertest = require('supertest');
require('dotenv').config();

describe('Server TESTS', function () {
    let request = null
    let server = null

    before(function (done) {
        process.env.MYVAR = 2;
        server = app.listen()
        request = supertest.agent(server)
        done()
    });

    after(function (done) {
        console.log("client------",process.env. MYVAR) //outputs 2
        server.close(done)
    });

})

问题: 运行mocha test之后,我的MYVAR不会反映server.js文件,它仍然是1。即使我在require('dotenv').config();

中注释了server.js

我该如何克服这个问题,也许我的超级测试代理结构不正确。请指教。

更新:

代替server = app.listen()server = require('../server').listen()
 按预期工作。

2 个答案:

答案 0 :(得分:0)

只需尝试在process.env.MYVAR = 2;之前致电app = require('../server')

require('dotenv').config();
process.env.MYVAR = 2;
var app = require('../server');
var supertest = require('supertest');

有一种更好的处理测试环境变量的方法,可以创建一个test/mocha.env.js文件,然后将--require test/mocha.env.js添加到mocha.opts,但这仍然取决于您的需求。

答案 1 :(得分:0)

我发现使用process.env的单元测试代码要容易得多,如果将其移至单独的模块并在测试期间将其存根:

// config/env.js
export default process.env;

// server.js
import env from 'config/env';

if (env.MYVAR === 2) {
  ...
}

// server.test.js
// stub config/env.js with library of your choice