1

我的工作,为了选择适合当前环境此时,相应的配置文件使用的值process.env.APP_ENV项目:与摩卡测试配置模块依赖于环境变量process.env.APP_ENV

import prodParams from './production'; 
import stgParams from './staging'; 
import devParams from './development'; 

let params = devParams; 
switch (process.env.APP_ENV) { 
    case 'production': 
    params = prodParams; 
    break; 
    case 'staging': 
    params = stgParams; 
    break; 
    default: 
    params = devParams; 
} 

export default params; 

我想用下面的代码来测试这个(尚未与断言):

import params from '../../../parameters'; 
... 

it.only('should return the appropriate config ', (done) => { 
    process.env.APP_ENV = 'production'; 
    console.log(params); 
    done(); 
}); 

然而,当我设置环境变量process.env.APP_ENV如上图所示,它仍然达到模块定义,因此它总是返回发展C onfig而不是生产环境。

撇开测试部分,功能工作正常,但我想不管测试它。

有关如何解决此问题的任何建议?

+1

我会建议,以避免依赖等全局属性' process.env'在你所有的模块中。在应用/测试设置的入口点读取环境变量并传递给它们。在你的'parameters.js'中导出一个'function',而不是一个以加载的环境作为参数的对象。 – MarcoL

回答

2

import语句在任何其他代码之前执行,因此您无法使用import进行此项工作。

可以有些得到它与require的工作,如果你需要的参数文件后,你已经设置环境变量:

process.env.APP_ENV = 'production'; 
let params = require('../../../parameters').default; 
... 

然而,这仍然不是很大,因为它”由于require维护的缓存(后续测试将APP_ENV设置为不同的值将不起作用),因此只能使用一次。

一种解决方法是将有parameters.js出口的函数,你会打电话:

// parameters.js 
export default function() { 
    let params = devParams; 
    switch (process.env.APP_ENV) { 
    ... 
    } 
    return params; 
} 

// test.js 
import getParams from '../../../parameters'; 
... 

process.env.APP_ENV = 'production'; 
let params = getParams(); 

或者设置APP_ENV外部:

$ env APP_ENV='production' mocha ... 
+0

我遇到了同样的问题,在修改process.env后,我'需要'测试者脚本。但是,我获得了通过我的.bash_profile设置的价值。这是为什么? –