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, вы получите результат вида:

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

Как получить значение из mui TextField

Июнь 18, 2023 г.

React компонент TextField библиотеки @mui/material - это сложный элемент и получить значение через свойство ref нельзя. Разработчики понимали, что доступ к HTMLInputElement внутри компонента нужно предоставить, и потому реализовали свойство inputRef, ...

Читать

Работа с html select в режиме multiple, отличия от обычного режима

Июнь 9, 2017 г.

HTML select с флагом multiple позволяет сделать выбор нескольких значений. В этой статье мы рассмотрим как правильно обработать данные, используя javascript ...

Читать

Как сделать кликабельные ссылки внутри SVG при использовании Fancybox

Июнь 21, 2025 г.

Когда вы используете Fancybox для отображения изображений, SVG и других медиа-объектов, возникает интересная проблема: если внутри SVG находятся ссылки (<a>), они перестают работать. Почему? Потому что Fancybox «перехватывает» клик, и вы не попадаете ...

Читать

Создание модальных окон в javascript

Апрель 12, 2017 г.

Модальные окна - этот термин пришел из десктопных приложений. Класс модального окна отсутствует в чистом javascript, но развитие веб-приложений требует ...

Читать
 

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

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



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