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

标签 javascript unit-testing ecmascript-6 environment-variables mocha.js

我正在开发一个使用 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 ...

关于javascript - 使用 mocha 测试依赖于环境变量 process.env.APP_ENV 的配置模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39587672/

相关文章:

javascript - 使用 javascript 预取加载外部数据集

javascript - Lightbox Overlay 不会在 Chrome 或 Edge 中向下滚动

c# - 以编程方式从编码 UI/单元测试中获取错误消息/堆栈跟踪

javascript - 在 JavaScript 中哪里添加事件处理程序?

javascript - 为什么 typeof null 的值会在循环内发生变化?

java - 如何使用构造函数注入(inject)模拟类

c# - TDD : Is it plausible to have integration tests, 但没有单元测试?

reactjs - 三元条件 - 尝试添加类错误

javascript - 为可以使用指定输入调用的对象创建通用函数

javascript - 如何使用 ES6 模块使用变量/函数的动态名称导出?