【问题标题】:Mocking date in jest开玩笑地嘲笑约会
【发布时间】: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

为什么在更改为使用箭头函数时出现此错误?

【问题讨论】:

标签: javascript typescript jestjs


【解决方案1】:

MockDate 应该模仿new Date(),这是一个constructor,箭头函数不能用作constructor

更多信息在这里:

【讨论】:

    【解决方案2】:

    我将辅助函数更新为:

    import { AnyObject } from 'typings/custom'
    
    /**
     * @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.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
    

    使用这个助手看起来像:

    /**
     * Testing a component that changes text based on time of day
     * ie: good morning, good afternoon & good evening
     */
    describe('Greeting', () => {
      it('Should update message after time', () => {
        jest.useFakeTimers()
        setMockDate(new Date('Feb 22, 2021 11:59:00'))
        const wrapper = mount(<Greeting />)
    
        const greetingText = wrapper.text()
        setMockDate(new Date('Feb 22, 2021 12:00:00'))
        jest.advanceTimersByTime(60000)
        expect(wrapper.text()).not.toBe(greetingText)
      })
    
    })
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-02
      • 1970-01-01
      • 2018-12-07
      相关资源
      最近更新 更多