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] });
  });