Unit тесты в TS (JS)

Рассмотрим как организовать юнит-тестирование для проектов на TS. Предполагается, что проект управляется npm. Потребуется установить три пакета для организации Unit-тестирования — это mocha (читается как мокка), chai и nyc.

Для JS этих пакетов было бы достаточно, но, т.к. у нас TS, то нужно еще описание типов: @testdeck/mocha, @types/chai, @types/mocha.

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

Mocha

Мокка — это, собственно, самый важный компонент этой инсталляции — фреймворк для тестирования. Чаще всего используют либо его, либо JEST.

Для него нужно создать дополнительный файл конфигурации в корне проекта — .mocharc.json

Как видите, он ссылается еще на один файл, где мы настроим TS для тестирования, это ./register.js

Это позволяет сделать независимую настройку typescript для фазы тестирования.

Chai

Это node.js библиотека проверки утверждений, внедряющая интерфейсы тестирования. Её можно подключить и как пакет и просто как js-скрипт.

Обычно, создавая тесты, вы пишите какие то утверждения (assertions), ожидая какой то результат. Chai предоставляет целых три интерфейса для написания тест-кейсов: should, expect и assert (или, если угодно, называйте это стилями). Мне лично нравится should, который превращает код в подобие человеку-понятного текста (посмотрим на него и восхитимся чуть позднее).

Chai помогает как с TDD, так и с BDD. Т.е. вы можете писать, используя его, как поведенческие, интеграционные тесты, так и модульные Unit-тесты, о которых идет речь в данной статье.

NYC

Еще один компонент, который мы используем в данной сборке, нужен для анализа покрытия кода тестами. Он вроде бы так и расшифровывается — now you're covered Подробнее можете ознакомиться с возможностями на странице пакета.

Нам нужно сконфигурировать его, создав файл .nyrc.json

Обратите внимание, что именно через NYC мы запускаем тесты в package.json.

Общая структура проекта

В целом, структура проекта будет выглядеть вот так:

В /src у нас находится index.ts, а также есть модуль, который экспортирует пример функции.

Для полноты картины приведу конфигурационные файлы TS

/tsconfig.json

/tests/tsconfig.json

Он немного отличается от основного, был создан как результат определенного опыта использования mocha + chai.

Тестируемый модуль

Перейдем от настройки к практике. У нас есть модуль — /src/modules/module.ts, в котором объявлена и экспортируется функция. В данном случае функция — это задачка с leetcode под номером 1701 — https://leetcode.com/problems/average-waiting-time/

На входе она ожидает массив из кортежей, а возвращает число.

Теперь мы хотим написать тесты для нашей функции.

Тестирование

Все тесты должны располагаться в папке /test, и иметь расширение *.test.ts. Это декларируется строкой запуска тестов в package.json:

Я создал несколько тестов для нашей функции в файле /tests/module.test.ts

Выбранный should интерфейс Сhai позволяет создавать цепочечные утверждения, которые, по сравнению с унылыми assert сравнениями, будут понятны и тестировщиками и бизнес-аналитикам. Один раз попробовав should, я больше не пишу в assert стиле :).

Ну вот для сравнения:

Запуская npm run test, вы получите результат вида:

Мало букафф? Читайте есчо !

Переменные окружения React для dev и prod

Сентябрь 15, 2023 г.

Если вы разрабатываете SPA на Reactjs, используя npx create-react-app my-app команду для создания проекта, то в коробке вы получаете множество полезных ...

Читать

Как перезагрузить страницу из js

Сентябрь 20, 2018 г.

Наиболее широко встречается следующий способ: [crayon-6a15ff03652e4703467150/] Он инициирует setter локации, заставляя браузер выполнить переход на указанную страницу. Не все браузеры поддаются на данную уловку. Если не указать отличное от прежнего ...

Читать

Обработка событий загрузки изображения

Май 16, 2025 г.

В веб-разработке важно уметь правильно обрабатывать процесс загрузки изображений. Браузеру может потребоваться время на подгрузку файла, особенно при медленном соединении или больших изображениях. Задача разработчика — отслеживать статус загрузки изображения ...

Читать

Связанные списки select с получением данных по ajax

Декабрь 15, 2016 г.

В прошлый раз я показывал как можно "на лету" создавать списки html select, данные которых содержались в специальном javascript массиве. Подготовить такой ...

Читать
 

Комментарии к «Unit тесты в TS (JS)»

Понравилась статья? Есть вопросы? - пишите в комментариях.



Комментарий: