Jest + react-navigation не обнаруживает маршрут / параметры

Я пытаюсь написать тест для приложения с использованием реакции-навигации, и у меня возникают проблемы с правильным чтением маршрута и параметров.

Я получаю сообщение об ошибке

TypeError: невозможно прочитать параметры свойства undefined

на const [leadId] = useState(route.params.leadId);

мои компоненты выглядят как

export default function AComponent() {
  const route = useRoute();
  const navigation = useNavigation();
  const dispatch = useDispatch();
  const [leadId] = useState(route.params.leadId);
}

Я пробовал следовать https://callstack.github.io/react-native-testing-library/docs/react-navigation/, но получилWarning: React.createElement: type is invalid при обертывании компонента.

Мой тест выглядит как

import React from 'react';
import { Provider } from 'react-redux';
import { NavigationContainer } from '@react-navigation/native';
import { render, fireEvent, cleanup } from 'react-native-testing-library';
import configureMockStore from 'redux-mock-store';

import AComponent from 'components/contact/AComponent';

const mockStore = configureMockStore([]);

describe('<AComponent />', () => {
  let getByTestId, store;

  beforeEach(() => {
    store = mockStore({});

    ({ getByTestId } = render(
      <Provider store={store}>
        <AComponent />
      </Provider>
    ));
  });
});

моя шутка

jest.mock('@react-navigation/native', () => {
  return {
    useNavigation: () => ({ goBack: jest.fn() }),
    useRoute: jest.fn(),
  };
});

Я не уверен, неправильно ли я упаковываю компоненты или мне не хватает чего-то еще.

Приветствуются любые идеи или помощь.

Спасибо.

0 ответов

Эй, я только что решил это сам и вот мое решение

+ Изменить

jest.mock('@react-navigation/native', () => {
  return {
    useNavigation: () => ({ goBack: jest.fn() }),
    useRoute: jest.fn(),
  };
});

Чтобы

jest.mock('@react-navigation/native', () => ({
  ...jest.requireActual('@react-navigation/native'),
  useNavigation: () => ({ goBack: jest.fn() }),
  useRoute: () => ({
    params: {
      <yourParamName>: '<paramValue>',
      <yourParamName2>: '<paramValue2>',
      etc...
    }
  }),
}));

В моем случае я поместил этот блок кода в свой файл setup.ts, а затем в свою конфигурацию jest внутри package.json я указал на него.

пример

"setupFiles": [
  "./node_modules/react-native-gesture-handler/jestSetup.js",
  "./jest/setup.ts"
]

Тогда в самом тесте

const navigation = { navigate: jest.fn() };
const { getByTestId, getByText, queryByTestId } = render(<App navigation={navigation}/>);
Другие вопросы по тегам