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

Testing config module with mocha that depends on environment variable process.env.APP_ENV

本文关键字:ENV 配置 模块 APP env 测试 mocha 依赖于 环境变量 process      更新时间:2023-09-26

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

撇开测试部分不谈,功能工作得很好,但我还是想测试一下。

有什么建议吗?

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 ...