Метод вложенного компонента ферментного теста

Я пытаюсь использовать Enzyme для проверки метода компонента. Я знаю, что типичный способ сделать это - использовать метод Enzyme instance().

Дело в том, что это работает только для компонента root, и мой компонент должен быть оберткой в ​​двух провайдерах контекста для рендеринга (а именно, response-router и apollo client).

  const wrapper = mount(
    <ApolloProvider client = {client}>
      <MemoryRouter initialEntries = {["/login"]}>
        <AuthFormContainer />
      </MemoryRouter>
    </ApolloProvider>
  );

Как я могу проверить methodA из AuthFormContainer в этом случае?

вам следует написать отдельный тестовый пример для AuthFormContainer

Shubham Khatri 08.06.2018 19:11

@ShubhamKhatri Не могли бы вы рассказать, как это сделать?

Théo Champion 10.06.2018 14:56

@ShubhamKhatri Я думаю, нам нужно протестировать ApolloProvider, если этот компонент создан командой apollo, потому что он уже был протестирован. ThéoChampion, если это ваш пользовательский компонент, протестируйте его отдельно

Palaniichuk Dmytro 12.06.2018 10:16

@ShubhamKhatri Да, но мой компонент должен быть обернут apolloProvider, чтобы иметь возможность рендеринга (authFormContainer - потребитель)

Théo Champion 12.06.2018 10:19

@ ThéoChampion, я хотел сказать, что если вы хотите протестировать функцию в AuthFormContainer, вам нужно написать тестовые примеры для этого компонента вместо того, чтобы писать его для компонента, который отображает ApolloProvider

Shubham Khatri 12.06.2018 10:21

@ShubhamKhatri Написание тестов для AuthFormContainer - вот что я пытаюсь сделать здесь

Théo Champion 12.06.2018 10:25

Можете ли вы показать, как выглядит ваш AuthFormContainer и как вы написали тесты

Shubham Khatri 12.06.2018 10:27
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
7
7
9 136
4

Ответы 4

Попробуйте find(ApolloProvider).dive() - и console.info его, чтобы увидеть дерево внутри.

если я это сделаю, я получу TypeError: wrapper.find(...).dive is not a function, хоть какое-то представление о том, что происходит?

Théo Champion 12.06.2018 10:24

кто ты обертка?

Palaniichuk Dmytro 12.06.2018 10:30

ты найдешь wrapper.find(ApolloProvider)?

Palaniichuk Dmytro 12.06.2018 10:36

Да, это вернет мне ReactWrapper { length: 1 }

Théo Champion 12.06.2018 10:37

взгляните на этот airbnb.io/enzyme/docs/api/ShallowWrapper/dive.html, возможно, вы что-то упустили.

Palaniichuk Dmytro 12.06.2018 10:40

Метод dive можно использовать только с мелким рендерингом, который у меня не работает, так как я обязан обернуть свой компонент в провайдеры контекстов.

Théo Champion 12.06.2018 10:52

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

Palaniichuk Dmytro 12.06.2018 10:56

если я делаю const wrapper = shallow(<AuthFormContainer />);, то console.info(wrapper.instance()) вернет null, есть идеи, что не так?

Théo Champion 12.06.2018 10:58

попробуйте const wrapper = shallow( <ApolloProvider client = {client}> <MemoryRouter initialEntries = {["/login"]}> <AuthFormContainer /> </MemoryRouter> </ApolloProvider> );

Palaniichuk Dmytro 12.06.2018 11:00

Это вернет мне экземпляр ApolloProvider ReactComponent

Théo Champion 12.06.2018 11:03

насчет реквизита find(ApolloProvider).props()

Palaniichuk Dmytro 12.06.2018 11:04

Да, это вернет мне реквизит ApolloProvider

Théo Champion 12.06.2018 11:11

Стоит ли копаться в детских реквизитах ApolloProvider, чтобы нырять? Кажется немного взломанным

Théo Champion 12.06.2018 12:48

TypeError: wrapper.find (...). Dive не является функцией. Если это ошибка, которую вы получаете, то это может быть связано с тем, что вы используете mount вместо shallow.

coderGuy 19.11.2020 11:16

Для компонентов React вы всегда пишете Единичные тесты. Согласно этому ответу: https://stackoverflow.com/a/652382/2873331:

Unit testing simply verifies that individual units of code (mostly functions) work as expected...

Итак, здесь вы должны попробовать проверить функциональность AuthFormContainer, а не то, правильно ли реагирующий маршрутизатор и клиент apollo вводят контекст. Ваш тестовый пример должен проверять: учитывая, что context - AuthFormContainer, работают ли его методы экземпляра должным образом или нет.

Чтобы ввести контекст, вы можете использовать метод Enzyme мелкий.

it('should work as expected', () => {
    const wrapper = shallow(< AuthFormContainer />, {
        context: { ... }, // pass expected context here

    });
    wrapper.instance().method(); //extract the required method by using instance
    ...
  });

Ссылка: http://airbnb.io/enzyme/docs/api/shallow.html

Кстати, не используйте mount, если вы действительно не хотите тестировать что-то на уровне DOM. mount делает ваши тесты очень медленными. Всегда предпочитаю shallow.

Ссылка: http://airbnb.io/enzyme/docs/api/mount.html

При модульном тестировании вам не следует беспокоиться о других компонентах. Но при необходимости можно использовать неглубокий рендеринг. Вот что я сделал:

const wrapper = shallow(
    <ApolloProvider client = {client}>
      <MemoryRouter initialEntries = {["/login"]}>
        <AuthFormContainer />
      </MemoryRouter>
    </ApolloProvider>
);

Получите дерево компонентов для AuthFormContainer, используя:

const authFormControllerTree = wrapper.find(MemoryRouter).shallow().find(AuthFormContainer).shallow()

Теперь, чтобы протестировать methodA в AuthFormContainer, вы можете просто сделать:

authFormControllerTree.instance().methodA();

Всегда тестируйте компонент оболочки иначе, чем подключенный компонент. Экспорт компонента оболочки и импорт в тестовый файл и тестирование, как вы делаете, но неглубоко (я предпочитаю)

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