Задать вопрос
@mikhavital

Как протестировать Lazy-компонент с Suspense внутри которого Suspense с помощью testing-library?

Приветствую!

При screen.debug() мне выдаёт fallback "Suspense App Container " из компонента Container, как мне дождаться подгрузки компонента ProjectsPage? Если уберу задержку, то всё работает, но она нужна) Помогите пожалуйста)

Путь до теста src/test.test.tsx
Codesandbox

Есть компонент RouterProvider, упрощу его для краткости:
import { ProjectsPageLazy as ProjectsPage } from "pages/ProjectsPage/ProjectsPage.lazy";

const RouterProvider = () => {
  return (
    <Suspense fallback="Loading Routes...">
      <Routes>
        <Route
          path="/app"
          element={
            <ProtectedRoute>
              <AppPage />
            </ProtectedRoute>
          }
        >
          <Route path="projects" element={<ProjectsPage />} />
        </Route>
      </Routes>
    </Suspense>
  );
};

В нем есть путь "/app" который направляет на lazy-компонент AppPage, так же его упрощу:
const AppPage = () => {
  return  <Container />
};

В нём находится компонент Container:
const Container = () => {
  return (
      <Suspense fallback={"Suspense App Container"}>
        <Outlet />
      </Suspense>
  );
};

В котором есть Outlet, в который подгружается ProjectPage lazy-компонент с задержкой:
const ProjectsPageLazy = lazy(async () => {
  return Promise.all([
    import("./ProjectsPage"),
    new Promise((resolve) => setTimeout(resolve, 2000)),
  ]).then(([moduleExports]) => moduleExports);
});

const ProjectsPage = () => {
  return <span>ProjectsPage</span>
};


Мой код для тестирования:
function ComponentRender(component,  options = {}) {
  const { route = "/app/dashboard", initialState = {} } = options;

  return render(
        <MemoryRouter initialEntries={[route]}>{component}</MemoryRouter>,
  );
}

/* RouterProvider.test.tsx  */
  test("Projects Route", async () => {
    await act(() => ComponentRender(<RouterProvider />, { route: "/app/projects" }));

    screen.debug();
  });
  • Вопрос задан
  • 258 просмотров
Подписаться 1 Простой 9 комментариев
Помогут разобраться в теме Все курсы
  • Яндекс Практикум
    Мидл фронтенд-разработчик
    5 месяцев
    Далее
  • Яндекс Практикум
    React-разработчик
    3 месяца
    Далее
  • Яндекс Практикум
    Фронтенд-разработчик
    10 месяцев
    Далее
Решения вопроса 1
WblCHA
@WblCHA
await waitFor(() => screen.getByText('Projects'), {
        timeout: 3000
      })

Но таймаут и тут и там можно смело меньше сделать (или вообще убрать), нет смысла лишний раз ждать.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
ITK academy Нижний Новгород
от 80 000 до 120 000 ₽
ITK academy Воронеж
от 50 000 до 90 000 ₽