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()
jest中的mock,jest.fn()jest.spyOn()jest.mock()