Reactjs 使用jest/酶模拟参考电流内部反应功能组件
我有一个组件,它的基本逻辑在这里(我用“…”来隐藏不必要的上下文)Reactjs 使用jest/酶模拟参考电流内部反应功能组件,reactjs,jestjs,material-ui,enzyme,react-functional-component,Reactjs,Jestjs,Material Ui,Enzyme,React Functional Component,我有一个组件,它的基本逻辑在这里(我用“…”来隐藏不必要的上下文) const tabs=React.useRef(null); const[showSelect,setShowSelect]=React.useState(false); const resizeHandler=React.useCallback(()=>{ 如果(tabs.current.childElementCount>2){ 设置显示选择(真); } 否则{ 设置ShowSelect(假); } },[tabs]); 返
const tabs=React.useRef(null);
const[showSelect,setShowSelect]=React.useState(false);
const resizeHandler=React.useCallback(()=>{
如果(tabs.current.childElementCount>2){
设置显示选择(真);
}
否则{
设置ShowSelect(假);
}
},[tabs]);
返回(
...
...
);
因此,我需要测试tabs.current.childElementCount大于2时的场景
问题是我不知道该怎么做。我无法模拟useRef来返回我需要的内容。在我的测试中将scrollButtons的值更改为“on”将提供所需的行为,但是,我们不能使用setProps(因为它不是根包装器)。我不知道黑客如何做到这一点(不知道他们是否存在)。此外,我还考虑过通过添加一些子组件来修改酶呈现的dom,但没有成功
这里是基本测试(没有使它实际工作的行)
it(“当childElementCount>2时,句柄大小调整正确,()=>{
常数分量=(
);
const setState=sinon.spy();
const useStateSpy=jest.spyOn(React,'useState')
useStateSpy.mockImplementation((值)=>[value,setState]);
//使tabs.current.childElementCount>2条件为真
const mountedComponent=安装(组件);
const resizeDetector=mountedComponent.find(resizeDetector);
resizeDetector.invoke(“onResize”)();
expect(setState,“使调用满足”{args:[true]});
});
Expect非常奇怪,因为我正在使用Expected的意外库(它不太流行)。因此,目前它希望使用false参数调用setState
const tabs = React.useRef(null);
const [showSelect, setShowSelect] = React.useState(false);
const resizeHandler = React.useCallback(() => {
if (tabs.current.childElementCount > 2) {
setShowSelect(true);
}
else {
setShowSelect(false);
}
}, [tabs]);
return (
<div className={classes.container}>
<ResizeDetector onResize={resizeHandler} />
...
<Tabs
value={activeTabIndex}
onChange={handleChange}
variant="scrollable"
scrollButtons="auto"
ScrollButtonComponent={ScrollButton}
ref={tabs}
>
...
</Tabs>
</div>
);
it("Handles onResize correct when childElementCount > 2", () => {
const component = (
<Provider store={store}>
<Router history={history}>
<IntlProvider locale="en">
<TabBar module={module} pages={pages} />
</IntlProvider>
</Router>
</Provider>
);
const setState = sinon.spy();
const useStateSpy = jest.spyOn(React, 'useState')
useStateSpy.mockImplementation((value) => [value, setState]);
// make tabs.current.childElementCount > 2 condition to be true
const mountedComponent = mount(component);
const resizeDetector = mountedComponent.find(ResizeDetector);
resizeDetector.invoke("onResize")();
expect(setState, "to have a call satisfying", { args: [true] });
});