> Какова роль юнит тестов при использовании TypeScript (TypeScript)

Уровень: senior · Роль: frontend · Категория: Технические вопросы

Компании: Альфа-банк

Стек: TypeScript

> Пример ответа

Короткий ответ

Юнит-тесты в TypeScript проверяют корректность работы отдельных модулей, функций или классов. Они дополняют статическую типизацию, проверяя логику выполнения, граничные случаи и бизнес-правила, которые не покрываются системой типов. TypeScript улучшает юнит-тестирование за счёт автодополнения, проверки типов в тестах и возможности использовать интерфейсы для моков.

Подробное объяснение

TypeScript как статически типизированный язык уже решает многие проблемы, которые в JavaScript требуют тестов: проверка типов аргументов, наличие полей у объектов, возвращаемые значения. Однако типы не гарантируют корректность бизнес-логики. Юнит-тесты в TypeScript выполняют следующие функции:

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

TypeScript даёт преимущества при написании тестов: IDE подсказывает типы, компилятор ловит несоответствия в тестовых данных, интерфейсы помогают создавать строго типизированные моки. Это снижает количество ложноположительных и ложноотрицательных результатов тестов.

На практике

В реальных проектах юнит-тесты на TypeScript пишутся с использованием фреймворков Jest, Vitest или Mocha с Chai. Типизированные моки создаются через jest.mock или библиотеки вроде ts-mockito. Важно тестировать не только "счастливый путь", но и граничные случаи: пустые массивы, null/undefined, некорректные форматы данных.

TypeScript помогает избежать типичных ошибок в тестах: передача неверных типов в тестируемую функцию, неправильная структура моков, несоответствие возвращаемых значений. При этом не стоит тестировать то, что уже проверяет компилятор - например, что функция принимает только строку.

Пример кода

TYPESCRIPT
// Функция для тестирования
export function calculateDiscount(price: number, discountPercent: number): number {
if (price < 0) throw new Error('Price cannot be negative')
if (discountPercent < 0 || discountPercent > 100) throw new Error('Invalid discount')
return price * (1 - discountPercent / 100)
}
// Юнит-тесты с Jest
describe('calculateDiscount', () => {
it('should apply 20% discount correctly', () => {
expect(calculateDiscount(100, 20)).toBe(80)
})
it('should return same price for 0% discount', () => {
expect(calculateDiscount(50, 0)).toBe(50)
})
it('should throw for negative price', () => {
expect(() => calculateDiscount(-10, 10)).toThrow('Price cannot be negative')
})
it('should throw for discount over 100%', () => {
expect(() => calculateDiscount(100, 150)).toThrow('Invalid discount')
})
})

Как отвечать на собеседовании

Начни с разграничения ответственности: типы проверяют структуру, тесты - поведение. Подчеркни, что TypeScript не отменяет юнит-тесты, а делает их надёжнее. Приведи пример, когда типы проходят, а логика ошибочна - например, функция возвращает правильный тип, но неверное значение. Упомяни, что тесты на TypeScript легче поддерживать из-за автодополнения и проверки типов в тестовых файлах.

Что проверяет интервьюер

Интервьюер оценивает понимание границ между статическим анализом и тестированием. Важно показать, что ты не путаешь проверку типов с проверкой бизнес-логики. Также проверяется знание практических аспектов: как типизировать моки, как избегать дублирования типов между кодом и тестами, как использовать TypeScript для улучшения качества самих тестов.

Типичные ошибки

  • утверждение, что TypeScript заменяет юнит-тесты
  • тестирование типов вместо логики (например, проверка, что функция возвращает number)
  • игнорирование типизации в тестовых файлах (any повсеместно)
  • отсутствие тестов на граничные случаи, которые не ловятся типами
  • переусложнение тестов из-за попыток типизировать каждый аспект

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью