我正在尝试将一个测试从酶迁移到反应测试库
酶的目的是“如果孩子不受影响,不应该强迫孩子重新渲染”。
const wasRendered = jest.fn();
const Component = (props) => (
<div {...props} />
);
const ChildComponent = () => {
wasRendered();
return <div>Hello</div>;
};
const SkinnableParent = Skinnable(config, Component); //Skinnable is a higher order component applied from our code.
const SkinnableChild = Skinnable(config, ChildComponent);
const subject = mount(
<SkinnableParent>
<SkinnableChild />
</SkinnableParent>
);
// Sending props to force parent to re-render
subject.setProps({className: 'foo'});
const expected = 1;
const actual = wasRendered.mock.calls.length;
expect(actual).toEqual(expected);通过测试库,我尝试使用rerender功能。
const wasRendered = jest.fn();
const Component = (props) => {
return <div {...props} />
};
const ChildComponent = () => {
wasRendered();
return <div>Hello</div>;
};
const SkinnableParent = Skinnable(config, Component); //Skinnable is a higher order component applied from our code.
const SkinnableChild = Skinnable(config, ChildComponent);
const RootComponent = ({className}) => {
return (
<SkinnableParent className={className}>
<SkinnableChild />
</SkinnableParent>
)
};
const {rerender} = render(<RootComponent />);
rerender(<RootComponent className='foo' />);
const expected = 1;
const actual = wasRendered.mock.calls.length;
expect(actual).toEqual(expected);问题是RTL的实际结果是2。“子”组件也正在重新命名。
是否有一种方法可以达到与以前的酶实现相同的效果?
发布于 2022-02-02 14:37:34
在那个测试中,没有什么能阻止ChildComponent的重发器。你的酶测试不是你想的那样。在本例中,阻止子组件中的重复器的唯一方法是用React.memo包装它。
当呈现父组件时,所有子组件都将重新呈现,除非通过备注或返回false的shouldComponentUpdate实现停止。
React具有良好的性能,因为即使组件被重新呈现,它也可能不需要在DOM中进行调解(这是一个沉重的计算负担。请参阅https://reactjs.org/docs/optimizing-performance.html#shouldcomponentupdate-in-action
您不应该担心避免重新呈现,除非组件中的JS很昂贵。
查看这个沙箱,复制您的测试用例,您将看到它两次呈现https://codesandbox.io/s/romantic-river-hcos6
在本例中,使用备忘录,它将只呈现一次https://codesandbox.io/s/condescending-lovelace-6z2j4
https://stackoverflow.com/questions/70957455
复制相似问题