【发布时间】:2020-03-19 17:22:16
【问题描述】:
我有一个 React Hook,它有一个简单的输入和按钮,如果没有输入,该按钮将被禁用,并且同一个按钮在启用时执行提取:
function MyComponent() {
const [ value, setValue ] = useState('')
function apiRequest() {
if (!value) {
return
}
axios.get('url')
.then(console.log)
.catch(console.log)
}
return (
<div>
<input onChange={e => setValue(e.target.value)} value={value} />
<button disabled={!value} onClick={apiRequest}>
Submit
</button>
</div>
)
}
我用Enzyme 写了两个测试。第一个测试 disabled 属性是否正确,第二个测试它是否实际获取。
it('sets the disabled prop appropriately', function() {
const wrapper = mount(<MyComponent />)
const input = wrapper.find('input')
const btn = wrapper.find('button')
expect(btn.prop('disabled')).toBeTruthy()
input.simulate('change', 'abc123')
expect(btn.prop('disabled')).toBeFalsy()
})
it('fetches on submit', function () {
const wrapper = mount(<MyComponent />)
const input = wrapper.find('input')
const btn = wrapper.find('button')
input.simulate('change', 'abc123')
btn.simulate('click')
expect(axios.get).toHaveBeenCalled()
})
但不幸的是,要进行第二次测试,需要启用按钮,因此必须先输入文本。所以实际上,第二个测试也是无意中测试 disabled 属性,因为如果 disabled 属性设置不正确,它将失败(onClick 不会触发)。
我关注了 React 的 recommended approach
test React components without relying on their implementation details
这是react-testing-library的核心原则,所以我纯粹是在测试副作用。我正在使用酶而不是那个,因为我的团队目前正在使用酶
我如何能够重写我的第二个测试,以便我可以仅测试获取?提前致谢。
编辑:或者更确切地说,有几种方法可以重写它以正确测试提取?
【问题讨论】:
标签: reactjs testing jestjs react-hooks enzyme