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