Jest в настоящее время является самой популярной библиотекой тестирования JavaScript. Становилось все более важным писать тестовые коды для обеспечения стабильности и надежности.
По сути, jest
позволяет тестировать различные условия, включая асинхронные вызовы. Но что, если вы хотите проверить коды в зависимости от ваших условий? В моем случае это было «Как я могу быть уверен, что ответ от вызова API сервера всегда будет таким же, как и схема JSON?». В любое время он может быть другим, в зависимости от того, какие данные вы запрашиваете, особенно когда вы вызываете API авиабилетов или API поиска жилья.
Потом я понял, что есть полезная функция под названием extend
.
Настройте свой проект
Хорошо, а теперь приступим к делу! :)
Перво-наперво создайте папку проекта, в которой будут находиться все связанные файлы.
npm init -y
Устанавливаем все нужные нам пакеты.
npm i -D jest ts-jest typescript @types/jest // package.json "scripts": { "test": "jest" }
ts-jest
- это препроцессор TypeScript с поддержкой исходной карты для Jest, который позволяет использовать Jest для тестирования проектов, написанных на TypeScript.
Наконец, сделайте папки.
mkdir src && cd src mkdir __tests__ mkdir typings mkdir example
Иерархия вашего проекта должна быть такой, как показано ниже. Если вы до сих пор хорошо выполнили эти шаги, теперь все готово!
node_modules src |--- __tests__ |--- example |--- typings package-lock.json package.json
Записать файлы конфигурации
Теперь мы должны дать TypeScript понять, что вы собираетесь использовать настраиваемые функции в своих тестовых кодах. Для этого нужно сделать несколько мелких вещей.
Создайте jest.config.js
и tsconfig.json
в своей корневой папке. Он будет автоматически получен и использован jest
и typescript
во время тестирования. Вы можете поместить эти конфигурации в свой package.json
. Для получения дополнительной информации нажмите Настройка Jest.
touch jest.config.js cd src && touch tsconfig.json
Простой тестовый код
Теперь давайте начнем с основных простых тестовых кодов, с которыми мы больше знакомы.
cd src && cd example touch math.ts
И создайте тестовый файл, который мы будем тестировать только что созданный math.ts
файл. Убедитесь, что в имени файла есть spec
.
cd __tests__ touch math.spec.ts
mockedAdd
- это шпионская функция, которую мы можем использовать для отслеживания использования исходной реализации ее функции, то есть math.add
. Для получения дополнительной информации о шпионской функции в Jest, щелкните здесь, чтобы перейти к документу Jest.
Обратите внимание, что существуют разные стили для проверки значений в expect (). Вы можете использовать шпионскую функцию и возвращаемое значение из исходной реализации или использовать фиктивный объект, который имеет calls и results объект, который отслеживает исходную реализацию.
Но что, если вы хотите, чтобы ваш тестовый код был успешным только тогда, когда значение - нечетное число? Стоит ли писать так?
if (num % 2 === 1) { expect(num).toBe(yourOdd); } else { expect(num).not.toBe(yourOdd); }
Не рекомендуется помещать expect
в if-else, это гипотетически.
В этой ситуации для вас есть полезная функция.
ожидать.extend ()
jest
позволяет добавлять дополнительные настраиваемые сопоставители. Чтобы jest
знать, где находятся ваши пользовательские сопоставители и что он должен с ними делать, нам нужно создать типизированный файл.
Мы собираемся создать функцию для проверки, является ли значение в expect () нечетным числом.
cd src && cd typings touch index.d.ts
Итак, иерархия каталогов должна быть такой.
node_modules src |--- __tests__ | | | |--- math.spec.ts |--- example | | | |--- math.ts |--- typings | | | |--- index.d.ts | |--- tsconfig.json jest.config.js package-lock.json package.json
Несмотря на то, что мы создали типизированный файл в папке typings, типизированный файл вообще не влияет на ваши тестовые коды. Он просто дает typescript
знать, что в сопоставителях jest
будет функция с именем toBeOdd
.
На самом деле мы должны добавить этот сценарий в math.spec.ts
.
Наш новый расширенный сопоставитель toBeOdd
принимает нулевые параметры, но получил. Параметр Received относится к значению, которое вы вводите в expect (). В данном случае это будет 2 и 3 в каждом случае.
Если вы хотите передать некоторые параметры в toBeOdd
, тогда конфигурации должны быть такими, как показано ниже.
// index.d.ts declare global { ... interface matchers<R> { toBeOdd(a: number): R; } } // math.spec.ts expect.extend({ toBeOdd(received, a) { .. do something } }); it('..', () => { /* received will be 3, and a will be 2 */ expect(3).toBeOdd(2); })
В сопоставлении возвращаются два значения, message и pass.
message - функция, не принимающая никаких параметров. Он показывает сообщение, которое показывает, когда тесты терпят неудачу.
pass - значение логического типа, которое определяет, когда показывать сообщение об ошибке в функции сообщения.
Если pass истинно, то функция message будет вызываться при сбое сопоставителя в expect(value).not.toBeOdd()
, с другой стороны, если pass ложно, функция сообщения будет вызываться при сбое expect(value).toBeOdd()
.
/* * pass: false * Since 2 isn't an odd number, it fails and the error from message * function will be * expected 2 not to be an odd number */ expect(2).toBeOdd(); /* * pass: true * Since 1 is an odd number, it fails and the error from message * function will be * expected 1 to be an odd number */ expect(1).not.toBeOdd();
Полный тестовый код
npm run test math
Заключение
Библиотеки тестирования JavaScript могут проверить ваши коды до выпуска проекта. Но иногда в используемой вами библиотеке тестирования не может быть идеального сопоставителя для вашей ситуации. Таким образом, эта функция сделает ваши тестовые коды более гибкими.