🚥

React リダイレクトをテストする

2022/02/28に公開

react-routerのバージョンは"react-router-dom": "5.2.0"

最初こんなふうにリダイレクトをテストしようとしていた。

import { MemoryRouter, Switch, Route } from 'react-router-dom';

test('5秒後リダイレクト', async () => {
  jest.useFakeTimers();

  render(
    <MemoryRouter
      initialEntries={[
        `https://example.com/callback?email=test%40example.com`,
      ]}
    >
      <Switch>
        <Route
          exact
          path="/callback"
          component={Callback}
        />
        <Route
          path="/login"
          component={() => <div>ログインページ</div>}
        />
      </Switch>
      ,
    </MemoryRouter>,
  );

  expect(screen.getByText(/リダイレクト中.../)).toBeInTheDocument();

  act(() => {
    jest.advanceTimersByTime(5000);
  });

  expect(await screen.findByText('ログインページ')).toBeInTheDocument();
})

しかし上記のコードだと、うまく Callback コンポーネントがレンダリングされない。最終的に以下のコードになった。

import { createMemoryHistory } from 'history';
import { Router } from 'react-router-dom';

test('5秒後リダイレクト', () => {
  jest.useFakeTimers();
  const history = createMemoryHistory({
    initialEntries: [
      `https://example.com/callback?email=test%40example.com`,
    ],
  });

  render(
    <Router history={history}>
      <Callback />
    </Router>
  );

  expect(screen.getByText(/リダイレクト中.../)).toBeInTheDocument();

  act(() => {
    jest.advanceTimersByTime(5000);
  });

  expect(history.location.pathname).toEqual('/login');
})

なぜ最初のコードがうまく動かないのかよくわからない。

Discussion