gpt4 book ai didi

javascript - 如何在执行导入之前在 jest 中模拟全局变量?

转载 作者:行者123 更新时间:2023-12-02 21:32:55 26 4
gpt4 key购买 nike

纪元的值是提前设置的,并且该函数有一个闭包,因为我不想重新生成纪元的值。

/* index.js */
const epoch = Date.now()

function appVersion() {
console.log(epoch)
}

export { appVersion }

我遇到的问题是,无论我如何模拟测试文件中的全局 Date 对象,该对象都会返回未模拟的值,因为导入首先执行。

如何在测试文件中模拟 Date.now()?

我现在使用的替代方案是将 Date.now() 放在单独的文件中,然后导入 jest.mock 文件

/* epoch.js */
const epoch = Date.now()

export = { epoch }
/* index.test.js */
import { appVersion } from './app-version'

jest.mock('./epoch', () => ({
epoch: '11111111'
})

最佳答案

处理日期和其他非确定性值(例如 Math.random())的常见模式是将它们作为参数传递,并给它们一个默认值。

const defaultEpoch = Date.now();

function appVersion(epoch = defaultEpoch) {
console.log(epoch)
}

export { appVersion }

这样,代码就可以按预期工作,但您现在可以在测试时传递特定值,以使其具有确定性:

import { appVersion } from './app-version'

it('uses epoch value for appVersion', () => {
const mockEpoch = '11111111';
const version = appVersion(mockEpoch);
expect(version).toBe('11111111');
};

关于javascript - 如何在执行导入之前在 jest 中模拟全局变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60574071/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com