jest.runAllTimers() 抛出类型错误

jest.runAllTimers() throws TypeError

我正在尝试 运行 使用 create-react-app 中的内置 react-scripts test 脚本进行以下测试:

Timer.test.js

render(<Timer />)
const pauseButton = screen.getByText('pause')
const timerOutput = screen.getAllByRole('heading')[1]

describe('Timer', () => {
  test('renders Timer component', () => {
    expect(screen.getByText(/session/i)).toBeInTheDocument()
    expect(screen.getByText(/25/)).toBeInTheDocument()
  })

  test('counts down when unpaused', async () => {
    jest.useFakeTimers()
    fireEvent.click(pauseButton)
    setTimeout(
      fireEvent.click(pauseButton),
      1125
    )
    jest.runAllTimers()
    expect(timerOutput).toHaveTextContent('24:59')
  })
})

Jest 在到达 jest.runAllTimers() 之前似乎工作正常,当我收到以下错误时:

 TypeError: callback.apply is not a function

      23 |       1125
      24 |     )
    > 25 |     jest.runAllTimers()
         |          ^
      26 |     expect(timerOutput).toHaveTextContent('24:59')
      27 |   })
      28 | 

      at node_modules/@jest/fake-timers/build/jestFakeTimers.js:524:25
      at callback (node_modules/@jest/fake-timers/build/jestFakeTimers.js:516:29)
      at FakeTimers._runTimerHandle (node_modules/@jest/fake-timers/build/jestFakeTimers.js:560:9)
      at FakeTimers.runAllTimers (node_modules/@jest/fake-timers/build/jestFakeTimers.js:193:12)
      at Object.<anonymous> (src/features/Timer.test.js:25:10)

我不知道发生了什么。为什么它不能完成 运行ning 测试?

您遇到的错误可能是因为 setTimeout 的使用。 setTimeout 接受一个函数作为第一个参数,但你给它的是 fireEvent.click(pauseButton) 的任何 return 类型。将代码更改为:

test('counts down when unpaused', async () => {
    jest.useFakeTimers();
    fireEvent.click(pauseButton)
    setTimeout(() =>  fireEvent.click(pauseButton), 1125);
            // ^ NOTE HERE
    jest.runAllTimers();
    expect(timerOutput).toHaveTextContent('24:59');
  })