Код-ревью Middle Тестирование обновлено

Код-ревью: тест экрана входа

Вопрос

Компонентный тест экрана входа. Найдите проблемы.

test('login', async () => {
  const { getByTestId, getByText } = render(<LoginScreen />);
  fireEvent.changeText(getByTestId('input-1'), 'user@mail.ru');
  fireEvent.changeText(getByTestId('input-2'), '123456');
  fireEvent.press(getByText('Войти'));
  await new Promise((r) => setTimeout(r, 2000));
  expect(getByText('Ошибка')).toBeNull();
  expect(LoginScreen.prototype.state.loggedIn).toBe(true);
});

Коротко

Хороший тест: моки API и нужные провайдеры, поиск по ролям и подписям, userEvent вместо прямых событий, ожидание через findBy, проверка видимого результата и вызова зависимостей, а не внутренностей компонента.

Что должен найти ревьюер

  1. Ошибкастрока 2
    Экран рендерится без провайдеров и без мока API: запрос уйдёт в реальную сеть или упадёт.
  2. Стильстрока 3
    Поиск по безликим testID (input-1): лучше по подписи или роли (getByLabelText('Email')).
  3. Производительностьстрока 6
    Реальное ожидание 2 секунды: медленно и нестабильно. Нужен findBy* или фейковые таймеры.
  4. Ошибкастрока 7
    getByText бросает ошибку, если элемента нет, проверка отсутствия так не работает: нужен queryByText(...) и toBeNull().
  5. Ошибкастрока 8
    Проверка внутреннего состояния компонента вместо поведения: у функционального компонента такого поля нет, тест хрупкий. Проверять видимый результат и вызов мока API или навигации.

Разбор

Хороший тест: моки API и нужные провайдеры, поиск по ролям и подписям, userEvent вместо прямых событий, ожидание через findBy, проверка видимого результата и вызова зависимостей, а не внутренностей компонента.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.