Closed6

window.location.reloadをモックしてテストコードを書きたい

kwstkwst

こんな感じでモックできないか?

it('...', () => {
  ...
  const mockReload = jest.fn()
  Object.defineProperty(window.location, 'reload', {
    configurable: true,
    value: mockReload,
  })
  ...
  expect(mockReload).toHaveBeenCalled()
})
kwstkwst

このエラーが出た。

    TypeError: Cannot redefine property: reload
        at Function.defineProperty (<anonymous>)
kwstkwst

spyOnを使ってできないか?

const mockReload = jest
      .spyOn(global.location, 'reload')
      .mockImplementation(() => {})
kwstkwst

エラーが出た。

TypeError: Cannot assign to read only property 'reload' of object '[object Location]'
kwstkwst

これならどうだろう?

it('...', () => {
  const mockReload = jest.fn()
  // 元のlocationを退避
  const { location } = window
  // locationをdelete
  delete (window as any).location // 「'delete' 演算子のオペランドはオプションである必要があります。ts(2790)」というエラーが出るので、as anyをかましている
  // reload関数をモック
  window.location = { ...location, reload: mockReload }
  ...
  expect(mockReload).toHaveBeenCalled()
  // 元のlocationに戻す
  window.location = location
})
このスクラップは2023/09/13にクローズされました