gpt4 book ai didi

javascript - 如何使用 React 测试库测试 HOC

转载 作者:行者123 更新时间:2023-12-05 06:05:15 25 4
gpt4 key购买 nike

我有一个 HOC,向组件添加一些 props,用于处理网络请求并将数据作为 prop 向下传递。以下是 HOC 的一个非常简化的版本:

export const withTags = (Component) => {
class WithTags extends PureComponent {
getItems() {
return getTags({
search: this.state.searchTerm
})
.then((items) => this.setState({
items
}));
}

.
.
.

render() {
return (
<Component
{...this.props}
items={this.state.items}
getItems={this.getItems}
/>
);
}
}

return withTags;
}

使用 enzyme 我可以轻松地做如下事情:

    it('should return tags', async () => {
const mockComponent = jest.fn(() => null);
const WithTagsComponent = withTags(mockComponent);

const wrapper = shallow(<WithTagsComponent />);
const res = await wrapper.props().getItems();

expect(res).toEqual(getTagsResponseMock);
expect(tagsApi.getTags).toHaveBeenCalledTimes(1);
expect(tagsApi.getTags).toHaveBeenCalledWith({
limit: PAGE_SIZE,
});
expect(wrapper.props().items).toEqual([tagFlowMock]);
});

但这种方法在 React 测试库中行不通,因为我们应该从最终用户的 Angular 进行测试,而不是访问 props。那么,我应该如何使用 React 测试库测试此类 HOC?

最佳答案

我认为您的测试几乎可以正常工作,但您需要更换两件东西。由于您在此处手动调用 getItems,因此您可以创建一个模拟组件,理想情况下它可以执行与您计划与 HOC 一起使用的组件类似的事情。例如,此模拟组件可能有一个按钮,单击该按钮会调用 getItems 并且还会显示 items

const MockComponent = ({items, getItems}) => { 
return (
<div>
<button data-testid="button" onClick={getItems}>Click me</button>
<ul>
{ items.map((item, index) => <li key={index}>{item}</li>) }
</ul>
</div>
)

然后在您的测试中而不是手动调用 getItems:

const res = await wrapper.props().getItems();

你可以做类似的事情

fireEvent.click(getByTestId('button')

然后断言您的 tagsApi 已被调用并且您的组件显示了正确的项目。

关于javascript - 如何使用 React 测试库测试 HOC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66066739/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com