React Router с массивом путей + точный по-прежнему инициализирует компоненты, когда местоположение не совпадает - PullRequest
1 голос
/ 04 февраля 2020

Я использую ReactRouter v5. У нас есть настройка, где есть 2 возможных маршрута для рендеринга Component1 и один маршрут для рендеринга Component2. Однако в моем тесте он неожиданно инициализирует Компонент 1.

const UsersRoutes: FC = () => {
  const location = useLocation();
  console.log(location)
  return (
    <Switch>
      <Route exact path={[routes.admin.users.root, routes.admin.users.import]} >
                {console.log('hi there i should not log') // I would not expect this to be called}
        <Users />
      </Route>
      <Route path={routes.admin.users.user.root()}>
        <UserRoutes />
      </Route>
    </Switch>
  );
};

В моем тесте:

describe('<User />', () => {
  test('user root redirects to profile', async () => {
    const { findByText, history, findByLabelText } = renderWithRouter(
      <UsersRoutes />,
      {
        route: routes.admin.users.user.root(testId),
      }
    );

    expect(history.location.pathname).toEqual(`/admin/users/${testId}/profile`);
    await findByText('profile');
    await findByLabelText('profile');
  });
});

Вывод на консоль:

console.log src/screens/App/screens/Admin/screens/Users/routes.tsx:9
    actual location hook:  {
      pathname: '/admin/users/123-test',
      search: '',
      hash: '',
      state: undefined,
      key: 'kdljhy'
    }

  console.log src/screens/App/screens/Admin/screens/Users/routes.tsx:14
    hi there i should not log

  console.log src/screens/App/screens/Admin/screens/Users/routes.tsx:9
    actual location hook:  {
      pathname: '/admin/users/123-test/profile',
      search: '',
      hash: '',
      state: undefined,
      key: 'zdaam2'
    }

  console.log src/screens/App/screens/Admin/screens/Users/routes.tsx:14
    hi there i should not log

Итак, как работает атрибут exact при использовании массива совпадающих путей? Это действительно ожидается? Ничто в журналах location не указывает на то, что этот путь должен быть найден.

...