如何在执行导入之前在玩笑中模拟全局变量?

问题描述 投票:0回答:1

epoch的值设置得很早,由于我不想重新生成epoch的值,因此该函数已关闭。

/* 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'
})

javascript unit-testing jestjs enzyme
1个回答
1
投票

处理日期和其他不确定性值(例如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');
};
© www.soinside.com 2019 - 2024. All rights reserved.