使用依赖于环境变量process.env.APP_ENV的mocha测试配置模块

时间:2016-09-20 07:02:06

标签: javascript unit-testing ecmascript-6 environment-variables mocha

我正在开发一个使用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时,它仍然以未定义的形式到达模块,因此它总是返回开发配置而不是生产环境。

抛开测试部分,功能正常,但我想测试它。

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

1 个答案:

答案 0 :(得分: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 ...