javascript 使用JEST [重复]更改单个测试的process.env变量

mrwjdhj3  于 2023-10-14  发布在  Java
关注(0)|答案(3)|浏览(104)

此问题已在此处有答案

how to reset module imported between tests(3个答案)
去年就关门了。
下面的代码在一个文件中,我试图测试:

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

目前,我使用setupFiles设置这个值,它指向env.js,它包含:

process.env.LOCAL_ENVIRONMENT = 'prod';

我的问题是,我如何改变process.env.LOCAL_ENVIRONMENTtest(或任何其他)在foo.test.js?只需要在一个测试中完成此操作,因此这一行将包含在我的测试覆盖范围中。
我试过这样做,但没有用...
foo.test.js

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

dgiusagp1#

您可以尝试更改该值。然而,你必须考虑到,在你的原始文件中,你只有在第一次加载这个脚本时才能访问变量。为了使这个工作,你必须这样做:

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

这有一些警告,因为你不能用它测试多个场景(因为模块只加载一次)。
如果你想测试更多的场景,你有多种选择:
例如,一种方法是将逻辑和进程.env. PROFILE_ENVIRONMENT分开

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

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

elcex8rz

elcex8rz2#

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

ws51t4hk

ws51t4hk3#

对于特定的测试用例,最简单的测试方法是将测试设置为描述范围,并根据您的需要在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
    });
  });
});

相关问题