【发布时间】:2021-06-20 06:55:45
【问题描述】:
我有一个名为 setMockDate 的函数,看起来像:
/**
* @param {Date} expected
* @returns {Function} Call to remove Date mocking
*/
const setMockDate = (expected: Date): AnyObject => {
const RealDate = Date
function MockDate(mockOverride?: Date | number) {
return new RealDate(mockOverride || expected)
}
MockDate.UTC = RealDate.UTC
MockDate.parse = RealDate.parse
MockDate.now = () => expected.getTime()
MockDate.prototype = RealDate.prototype
// eslint-disable-next-line @typescript-eslint/no-explicit-any
global.Date = MockDate as any
return () => {
global.Date = RealDate
}
}
export default setMockDate
并像这样使用:
test('Should change date', () => {
const mockDate = new Date('Feb 22, 2021 11:59:00')
setMockDate(mockDate)
expect(new Date()).toEqual(mockDate)
})
我想将setMockDate() 中的MockDate 函数更改为使用如下箭头函数:
const MockDate = (mockOverride?: Date | number) => {
return new RealDate(mockOverride || expected)
}
但是我得到TypeError:
TypeError: Date is not a constructor
为什么在更改为使用箭头函数时出现此错误?
【问题讨论】:
-
这个实现看起来既复杂又脆弱——让时间成为一种依赖比尝试修补人们可以与全局
Date交互的所有可能方式要容易得多(具体应用请参见stackoverflow.com/a/65130857/3001761 )。此外,您测试中的mockDate实际上并不是模拟,而是真正的Date(因为您还没有setMockDate)。
标签: javascript typescript jestjs