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 могут проверить ваши коды до выпуска проекта. Но иногда в используемой вами библиотеке тестирования не может быть идеального сопоставителя для вашей ситуации. Таким образом, эта функция сделает ваши тестовые коды более гибкими.