Тестирование API `React.createRef` с помощью Enzyme - PullRequest
0 голосов
/ 07 февраля 2019

Я хотел бы протестировать следующий класс, который использует API React.createRef.

Быстрый поиск не выявил каких-либо примеров этого.У кого-нибудь был успех?Как бы я стал издеваться над реф?

В идеале я хотел бы использовать 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);
  }); 

1 Ответ

0 голосов
/ 07 февраля 2019

Специальных процедур для рефери, которые будут проверены, не существует.Ссылка - это просто объект с ключом current.

В случае, если к нему обращаются в начале componentDidMount, для тестирования необходимо отключить хуки жизненного цикла.Компонент должен быть проверен на то, что у него изначально есть ссылка, затем его можно смоделировать

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

Поскольку ссылка передается другому компоненту в качестве реквизита, можно проверить, что ему был предоставлен правильный ref:

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

Затем в тесте Wrapper можно проверить, что клавише ref current присвоен правильный объект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...