Тест моментального снимка Jest добавляет слово «_class» в React HOC в моментальном снимке на CI, но не на моей машине

У меня есть компонент React, импортирующий другой React HOC.

Мой React HOC:

      import { withRouter } from "react-router";
...
const InnerComponent: FC<any> = (props): ReactElement => {
...
}

const withData = compose(
  graphql(SOME_QUERY, {
    props: mapProps,
    options,
  }),
  injectIntl
);

export default withRouter(withX(withData(InnerComponent)));

Мой компонент React:

      export const OuterComponent: FC<any> = (props): ReactElement => {
    ...
    return (
    ...
    <InnerComponent />
    ...
)}

Это отрывок из моего тестового файла спецификации (я использую фермент и шутку):

      const component = shallow(<OuterComponent {...props} />)
expect(component).toMatchSnapshot()

Локально все работает нормально. Часть, в которой должен отображаться мой InnerComponent, представлена ​​на снимке следующим образом:

      <withRouter() />

Когда я регистрирую свой код и позволяю ему работать на CI, тест снимка не проходит, потому что эта строка в снимке, который генерирует CI, выглядит следующим образом:

      <withRouter(_class) />

Я уверен, что версии энзима и шутки одинаковы на CI и на моей машине. Я даже пытался обновить шутку и энзим на своей машине, но так и не получил снимок с этим странным словом.

Где это _class откуда и как я могу этого избежать, или как убедиться, что моя локальная установка также генерирует его во время создания моментального снимка?

1 ответ

Этой проблемы можно избежать, правильно настроив наши пользовательские HOC. В этом случае withX HOC не было displayName. Я изменил его так, чтобы он выглядел так, как показано ниже, так что HOC в моментальном снимке создается с тем же именем как на локальном компьютере, так и на сервере сборки.

      export function withX(WrappedComponent) {  
  class WithX extends React.Component {
    render() {
      ...     
      return <WrappedComponent {...this.props} />
    }
  }
  WithX.displayName = `WithX(${getDisplayName(WrappedComponent)})`
  return WithX
}

function getDisplayName(WrappedComponent) {
  return WrappedComponent.displayName || WrappedComponent.name || 'Component'
}

Это все еще не объясняет, почему у HOC не было имени на локальном компьютере, но было имя _class на сервере сборки.

Другие вопросы по тегам