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

时间:2019-03-25 16:19:04

标签: reactjs enzyme setstate react-hooks

当我用酶测试班级成分时,我可以wrapper.setState({})来设置状态。当我使用useState()钩子测试功能组件时,现在该怎么做?

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

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

我想在测试中更改mode

2 个答案:

答案 0 :(得分:5)

这就是我发现的方法,并不是说这是对还是错。就我而言,代码块取决于将状态设置为特定值。我会保留自己对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的所有实例,因此,如果您要查看的状态值超过一个,则它们都将设置为“新模式值” 。其他人也许可以帮助您解决问题。希望对您有所帮助。

答案 1 :(得分:3)

使用挂钩状态时,您的测试必须忽略诸如状态之类的实现细节,以便对其进行正确测试。 您仍然可以确保组件将正确的状态传递到其子级。

您可以在肯特C.多德斯(Kent C. Dodds)撰写的blog post中找到一个很好的例子。

这里有一位代码专家,并提供了一个代码示例。

依赖状态实现细节的测试-

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')
})