首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在执行import之前在jest中模拟全局变量?

如何在执行import之前在jest中模拟全局变量?
EN

Stack Overflow用户
提问于 2020-03-07 11:16:56
回答 1查看 659关注 0票数 0

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

代码语言:javascript
复制
/* index.js */
const epoch = Date.now()

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

export { appVersion }

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

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

我现在使用的替代方法是在一个单独的文件中使用Date.now(),然后对导入的文件执行jest.mock

代码语言:javascript
复制
/* epoch.js */
const epoch = Date.now()

export = { epoch }
代码语言:javascript
复制
/* index.test.js */
import { appVersion } from './app-version'

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

回答 1

Stack Overflow用户

发布于 2020-03-07 11:28:02

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

代码语言:javascript
复制
const defaultEpoch = Date.now();

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

export { appVersion }

通过这种方式,代码可以按预期工作,但您现在可以在测试时传入特定值,以使其具有确定性:

代码语言:javascript
复制
import { appVersion } from './app-version'

it('uses epoch value for appVersion', () => {
  const mockEpoch = '11111111';
  const version = appVersion(mockEpoch);
  expect(version).toBe('11111111');
};
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60574071

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档