javascript - 使用 enzyme 测试 `React.createRef` api

标签 javascript reactjs jestjs enzyme

我想测试以下使用 React.createRef api 的类。

不过,快速搜索并没有发现任何这样做的例子。有没有人成功过?我将如何 mock 裁判?

理想情况下,我想使用shallow

class Main extends React.Component<Props, State> {

  constructor(props) {
    super(props);
    this.state = {
      contentY: 0,
    };

    this.domRef = React.createRef();
  }

  componentDidMount() {
    window.addEventListener('scroll', this.handleScroll);
    handleScroll();
  }

  componentWillUnmount() {
   window.removeEventListener('scroll', this.handleScroll);
  }

  handleScroll = () => {
    const el = this.domRef.current;
    const contentY = el.offsetTop;
    this.setState({ contentY });
  };

  render() {
    return (
      <Wrapper innerRef={this.domRef}>
        <MainRender contentY={this.state.contentY} {...this.props} />
      </Wrapper>
    );
  }
}

更新

所以我可以使用回调引用来测试它,如下所示

 setRef = (ref) => {
   this.domRef = ref;
 }

 handleScroll = () => {
   const el = this.domRef;
   if (el) {
     const contentY = el.offsetTop;
     this.setState({ contentY });
   }
 };

 render() {
   return (
     <Wrapper ref={this.setRef}>
       <MainRender contentY={this.state.contentY} {...this.props} />
     </Wrapper>
   );
 }
}

然后测试类似的东西

it("adds an event listener and sets currentY to offsetTop", () => {
    window.addEventListener = jest.fn();
    const component = shallow(<ScrollLis />)
    const mockRef = { offsetTop: 100 };
    component.instance().setRef(mockRef);
    component.instance().componentDidMount();
    expect(window.addEventListener).toBeCalled();
    component.update();
    const mainRender = component.find(MainRender);
    expect(mainRender.props().contentY).toBe(mockRef.offsetTop);
  }); 

最佳答案

对于要测试的 refs 没有特定的例程。 ref 只是一个具有 current 键的对象。

如果它在 componentDidMount 的早期访问,需要禁用生命周期 Hook 以进行测试。一个组件应该被测试它最初有一个 ref,然后它可以被模拟

const wrapper = shallow(<Comp/>, { disableLifecycleMethods: true });
expect(wrapper.instance().domRef).toEqual({ current: null });
wrapper.instance().domRef.current = mockRef;
wrapper.instance().componentDidMount();

由于 ref 作为 prop 传递给另一个组件,因此可以测试它是否提供了正确的 ref:

expect(wrapper.find(Wrapper).dive().props().innerRef).toBe(wrapper.instance().domRef);

然后在 Wrapper 测试中可以测试 ref current 键是否被分配了正确的对象。

关于javascript - 使用 enzyme 测试 `React.createRef` api,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54570400/

相关文章:

javascript - 数组构造函数 "new Array()"可以被恶意代码覆盖和替换,如何?

javascript - 如何判断 Canvas 动画何时结束

javascript - Meteor 模板助手和对集合字段的访问

javascript - 使用 d3 动画条形图并使用react

reactjs - MUI TextField 不接受模式

javascript - 为什么在 JavaScript 中任何数字除以 -Infinity 时都会得到 -0?

javascript - 光滑的轮播 - 淡入淡出效果不起作用

javascript - react : checker is not a function

reactjs - 预期的spyOn函数被称为Jest

javascript - 如何测试 Firebase 登录操作 (React/Jest)