Jest + process.env.NODE_ENV 没有正确测试

Posted

技术标签:

【中文标题】Jest + process.env.NODE_ENV 没有正确测试【英文标题】:Jest + process.env.NODE_ENV not testing properly 【发布时间】:2021-06-07 20:31:16 【问题描述】:

我有一个基于process.env.NODE_ENV 更改变量的配置文件,函数如下:

const  hostname  = window.location

let USE_DEV_TOOLS = false
if (
  hostname === 'qa.example.com' ||
  hostname === 'dev.example.com' ||
  NODE_ENV !== 'production'
) 
  USE_DEV_TOOLS = true

在我的测试中,我想测试如果NODE_ENV 是生产,USE_DEV_TOOLS 返回false 但是,如果我尝试更改NODE_ENV,它会在获取变量后更新。

import config from 'consts/config'
describe('Environment variables', () => 
  const ORIGINAL_ENV = process.env
  beforeEach(() => 
    jest.resetModules()
    process.env =  ...ORIGINAL_ENV 
  )

  afterAll(() => 
    process.env = ORIGINAL_ENV
  )

  it('production does not use dev tools', () => 
    process.env =  NODE_ENV: 'production' 

    // console logs properly, but is changing after I get config
    console.log(process.env.NODE_ENV) 

    expect(config.USE_DEV_TOOLS).toBe(false)
  )
) 

【问题讨论】:

我认为问题是你在设置这个值之前导入了文件,我有一个类似的例子,如果它有帮助的话,还有一个配置github.com/gkampitakis/fastify-template-server/blob/master/src/… 【参考方案1】:

使用es6 import导入模块,模块中的代码会立即执行,此时process.env.NODE_ENV环境没有被修改。

所以你应该在测试用例中修改process.env.NODE_ENV后使用require来要求模块。

例如

config.js:

const  hostname  = window.location;

console.log('config loaded');

let USE_DEV_TOOLS = false;
if (hostname === 'qa.example.com' || hostname === 'dev.example.com' || process.env.NODE_ENV !== 'production') 
  USE_DEV_TOOLS = true;


export default  USE_DEV_TOOLS ;

config.test.js:

describe('Environment variables', () => 
  const ORIGINAL_ENV = process.env;
  beforeEach(() => 
    jest.resetModules();
    process.env =  ...ORIGINAL_ENV ;
  );

  afterAll(() => 
    process.env = ORIGINAL_ENV;
  );

  it('production does not use dev tools', () => 
    process.env =  NODE_ENV: 'production' ;
    console.log(process.env.NODE_ENV);
    const config = require('./config').default;

    expect(config.USE_DEV_TOOLS).toBe(false);
  );
);

测试结果:

 PASS  examples/66555582/config.test.js
  Environment variables
    ✓ production does not use dev tools (10 ms)

  console.log
    production

      at Object.<anonymous> (examples/66555582/config.test.js:16:13)

  console.log
    config loaded

      at Object.<anonymous> (examples/66555582/config.js:3:9)

Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        1.392 s, estimated 4 s

【讨论】:

以上是关于Jest + process.env.NODE_ENV 没有正确测试的主要内容,如果未能解决你的问题,请参考以下文章

jest中的mock,jest.fn()jest.spyOn()jest.mock()

Mocha 与 Jest 测试框架比较

单元测试jest部署

jest中的mock,jest.fn()jest.spyOn()jest.mock()

jest中的mock,jest.fn()jest.spyOn()jest.mock()

Jest-vue 和 Vue-jest 有啥区别?