【问题标题】:Change process.env variable for single test using JEST [duplicate]使用 JEST 更改单个测试的 process.env 变量 [重复]
【发布时间】:2022-02-15 23:26:31
【问题描述】:

我正在尝试测试的文件中有以下代码:

foo.js

let localEnv = (process.env.LOCAL_ENVIRONMENT).toLowerCase() === 'prod' ? 'prod' : 'stage';

目前,我使用指向env.jssetupFiles 设置此值,它包含:

process.env.LOCAL_ENVIRONMENT = 'prod';

我的问题是,我如何将foo.test.js 中的process.env.LOCAL_ENVIRONMENT 更改为test(或其他任何内容)?只需在单个测试中执行此操作,因此我的测试覆盖范围将涵盖这一行。

我尝试做这样的事情,但没有成功......

foo.test.js

test('Nonprod', async () => { 
  process.env.LOCAL_ENVIRONMENT = 'test';
  ...
});

【问题讨论】:

    标签: javascript node.js unit-testing jestjs


    【解决方案1】:

    您可以在尝试时更改该值。但是,您必须考虑到,在您的原始文件中,您只能在首次加载此脚本时访问该变量。为了完成这项工作,您必须这样做:

    // in your test file foo.test.js
    const prev = process.env.LOCAL_ENVIRONMENT
    process.env.LOCAL_ENVIRONMENT = 'test'; // from now on the env var is test
    const myModule = require('./foo.js'); // foo.js is executed and the var is read as test
    process.env.LOCAL_ENVIRONMENT = prev; // change value back
    

    这有一些问题,因为您无法使用它测试多个场景(因为该模块只加载一次)。

    如果您想测试更多场景,您有多种选择:

    例如,一种方法是将逻辑和 process.env.LOCAL_ENVIRONMENT 分开

    function getLocalEnv(env = process.env.LOCAL_ENVIRONMENT) {
      return env.toLowerCase() === 'prod' ? 'prod' : 'stage';
    }
    

    这个函数现在很容易测试,不再依赖于环境变量

    【讨论】:

    • 嗯...不确定我是否完全遵循。评论中的原始文件是什么意思“但是您必须考虑到原始文件中的内容...”
    • 似乎很奇怪,没有一种优雅的方法可以仅针对单个测试更改环境变量...
    • 对不起,原始文件我的意思是foo.js。由于此文件是必需的,因此它只执行一次,因此您的 localDev 只计算一次并使用值 process.env。 LOCAL_ENVIRONMENT当时有
    • 明白了。现在说得通了。您能否进一步解释您提到的multiple 选项以及我可以如何使用它?
    • 啊,在这里找到答案了,感谢帮助:stackoverflow.com/questions/48989643/…
    【解决方案2】:

    我在这里找到了如何重置和重新要求测试模块的答案: how to reset module imported between tests

    【讨论】:

      【解决方案3】:

      针对特定测试用例对其进行测试的最简单方法是将测试设置为描述范围,并根据您的需要在 beforeAll / afterAll 或 beforeEach / afterEach 挂钩中应用/删除 env 值。

      describe('Test example', () => {
        describe('prod (default)', () => {
          test('do the thing', () => {
            doTheThing(); // process.env.LOCAL_ENVIRONMENT is by default 'prod' because of your setupFiles
          });
        });
        describe('test env', () => {
          const oldEnv = process.env.LOCAL_ENVIRONMENT; // or { ...process.env } to copy the whole env
      
          beforeAll(() => {
            process.env.LOCAL_ENVIRONMENT = 'test';
          });
          afterAll(() => {
            process.env.LOCAL_ENVIRONMENT = oldEnv; // do not forget to do this
          });
      
          test('do the thing', () => {
            doTheThing(); // process.env.LOCAL_ENVIRONMENT is 'test' here
          });
        });
      });
      

      【讨论】:

      • 试过这个。虽然它确实更改了环境变量,但正在测试的导入文件看不到这一点。 let localEnv = (process.env.LOCAL_ENVIRONMENT).toLowerCase() === 'prod' ? 'prod' : 'stage'; 总是 prod 即使使用上述方法。
      • 我的错,我误解了你的问题。我想回答标题(“Change process.env variable for single test using JEST”)。这种方式只有在你在函数中动态获取 env 时才有效,而不是在导入时。使用您的解决方案时要小心,可能很难长期维护,每次编辑 process.env 变量时都使用 process.env 重新导入每个文件。但由于实施,这是使其工作的唯一方法。
      猜你喜欢
      • 2018-06-10
      • 2019-10-26
      • 2021-03-11
      • 2019-09-11
      • 2023-04-02
      • 2016-05-28
      • 2018-12-01
      • 2018-12-24
      • 2019-07-23
      相关资源
      最近更新 更多