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

Вот образец моего кода

// App.js

import React, { Suspense, lazy } from "react";

const Loader = () => <div data-testid="loader">Loading...</div>

const Login = lazy(() => import("./Login"));

function App() {
  return (
    <Suspense fallback={<Loader />}>
      <Login />
    </Suspense>
  );
}

export default App;

// Login.js

import React from 'react';

const Login = () => <div data-testid="login">Login</div>

export default Login
// App.test.js

import React from 'react';
import { render, waitForElementToBeRemoved, cleanup } from '@testing-library/react';
import App from './App';


describe('App when user is not signed in', () => {
  it("should redirect to login page", async () => {
    beforeEach(() => jest.resetAllMocks())
    const { getByTestId, getByText } = render(<App />);
    await waitForElementToBeRemoved(() => getByTestId('loader'))
    const linkElement = getByText(/Login/i);
  
    expect(linkElement).toBeInTheDocument();
  });
})

describe('App with User Logged in as Admin', () => {
  it("redirect to login page", async () => {
    beforeEach(() => {
      // will set local storage for auth token
      // for a logged in user
    })
    let container = document.createElement('div')
    const { getByTestId, getByText } = render(<App />, {
      container
    });
  
    await waitForElementToBeRemoved(() => getByTestId('loader'))
    const linkElement = getByText(/Login/i);
  
    expect(linkElement).toBeInTheDocument();
  });
})

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

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

Я написал ответ на этот вопрос здесь. https://repl.it/@tibetegya/Create-React-App

1 ответ

toBeInTheDocument утверждает, что элемент существует в документе, как следует из названия:

Библиотека утилит jest-dom предоставляет средство сопоставления.toBeInTheDocument(), которое можно использовать для подтверждения того, что элемент находится в теле документа или нет. Это может быть более значимым, чем утверждение, что результат запроса равен нулю.

Компонент был отрисован как отсоединенный container элемент во втором тесте и не существует в документе DOM, поэтому тест не проходит.

Вместо этого можно использовать базовые утверждения Jest, как предлагает документация:

expect(linkElement).not.toBeNull()

Может не быть причин использовать настраиваемый контейнер, если нет необходимости тестировать, как компонент работает в отдельных элементах.

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