在使用 useState() 钩子测试功能组件时设置状态



当我用酶测试类成分时,我可以做wrapper.setState({})来设置状态。当我使用钩子测试函数组件时,我现在如何做同样的事情useState()

例如,在我的组件中,我有:

const [mode, setMode] = useState("my value");

我想更改测试中的mode

当从钩子使用状态时,你的测试必须忽略实现细节,如状态,以便正确测试它。您仍然可以确保组件将正确的状态传递到其子组件中。

你可以在Kent C. Dodds写的这篇博文中找到一个很好的例子。

下面是其中的摘录,其中包含一个代码示例。

依赖于状态实现详细信息的测试 -

test('setOpenIndex sets the open index state properly', () => {
  const wrapper = mount(<Accordion items={[]} />)
  expect(wrapper.state('openIndex')).toBe(0)
  wrapper.instance().setOpenIndex(1)
  expect(wrapper.state('openIndex')).toBe(1)
})

不依赖于状态实现详细信息的测试 -

test('counter increments the count', () => {
  const {container} = render(<Counter />)
  const button = container.firstChild
  expect(button.textContent).toBe('0')
  fireEvent.click(button)
  expect(button.textContent).toBe('1')
})

这就是我发现的方法,我并不是说这是对还是错。在我的例子中,代码块依赖于将状态设置为特定值。我会保留我对 React 中测试的看法。

在测试文件中:调整反应库的导入

import * as React from 'react'

然后在您的测试中监视useState并模拟其实现

const stateSetter = jest.fn()
jest
.spyOn(React, 'useState')
//Simulate that mode state value was set to 'new mode value'
.mockImplementation(stateValue => [stateValue='new mode value', stateSetter])

请注意,模拟 useState 这将适用于为您的测试调用 useState 的所有实例,因此如果您正在查看多个状态值,它们都将设置为"新模式值"。其他人也许能够帮助您解决这个问题。希望对您有所帮助。

在测试文件的顶部,可以首先定义为:

  import { useState } from 'react';
  jest.mock('react', () => ({
    ...jest.requireActual('react'),
    useState: jest.fn()
  }));
  const useStateMock: jest.Mock<typeof useState> = useState as never;

之后,在每个测试中可以使用不同的值,这些值是要测试的:

  const setValue = jest.fn();
  useStateMock
    .mockImplementation(() => ['value', setValue]);

相关内容

  • 没有找到相关文章

最新更新