问题描述
我有一个依赖导出的 const
变量的文件。此变量设置为 true
但是如果需要可以手动设置为 false
以防止下游服务请求时出现某些行为它。
I have a file that relies on an exported const
variable. This variable is set to true
but if ever needed can be set to false
manually to prevent some behavior if downstream services request it.
我不知道如何在Jest中模拟 const
变量,以便我可以更改它的值测试 true
和 false
条件。
I am not sure how to mock a const
variable in Jest so that I can change it's value for testing the true
and false
conditions.
示例:
//constants module
export const ENABLED = true;
//allowThrough module
import { ENABLED } from './constants';
export function allowThrough(data) {
return (data && ENABLED === true)
}
// jest test
import { allowThrough } from './allowThrough';
import { ENABLED } from './constants';
describe('allowThrough', () => {
test('success', () => {
expect(ENABLED).toBE(true);
expect(allowThrough({value: 1})).toBe(true);
});
test('fail, ENABLED === false', () => {
//how do I override the value of ENABLED here?
expect(ENABLED).toBe(false) // won't work because enabled is a const
expect(allowThrough({value: 1})).toBe(true); //fails because ENABLED is still true
});
});
推荐答案
如果将ES6模块语法编译为ES5,因为最后,所有模块导出都属于同一个对象,可以修改。
This example will work if you compile ES6 modules syntax into ES5, because in the end, all module exports belong to the same object, which can be modified.
import { allowThrough } from './allowThrough';
import { ENABLED } from './constants';
import * as constants from './constants';
describe('allowThrough', () => {
test('success', () => {
constants.ENABLED = true;
expect(ENABLED).toBe(true);
expect(allowThrough({ value: 1 })).toBe(true);
});
test('fail, ENABLED === false', () => {
constants.ENABLED = false;
expect(ENABLED).toBe(false);
expect(allowThrough({ value: 1 })).toBe(false);
});
});
或者,您可以切换到原始commonjs require
功能,并在 jest.mock(...)
的帮助下这样做:
Alternatively, you can switch to raw commonjs require
function, and do it like this with the help of jest.mock(...)
:
const mockTrue = { ENABLED: true };
const mockFalse = { ENABLED: false };
describe('allowThrough', () => {
beforeEach(() => {
jest.resetModules();
});
test('success', () => {
jest.mock('./constants', () => mockTrue)
const { ENABLED } = require('./constants');
const { allowThrough } = require('./allowThrough');
expect(ENABLED).toBe(true);
expect(allowThrough({ value: 1 })).toBe(true);
});
test('fail, ENABLED === false', () => {
jest.mock('./constants', () => mockFalse)
const { ENABLED } = require('./constants');
const { allowThrough } = require('./allowThrough');
expect(ENABLED).toBe(false);
expect(allowThrough({ value: 1 })).toBe(false);
});
});
这篇关于如何在jest中模拟导出的const的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!