> Какова роль юнит тестов при использовании 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)}// Юнит-тесты с Jestdescribe('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 повсеместно)
- отсутствие тестов на граничные случаи, которые не ловятся типами
- переусложнение тестов из-за попыток типизировать каждый аспект
> Похожие задачи по frontend
Распространяется ли концепция SOLID на TypeScript
Где и как прописать аннотацию типа в TypeScript
Какие модификаторы классов есть в TypeScript
Как реализовать динамически настраиваемое поле в интерфейсе TypeScript
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью