Добро пожаловать в захватывающий мир NestJS и Jest! В этой статье мы отправимся в путешествие, чтобы изучить искусство модульного тестирования приложений NestJS с использованием среды тестирования Jest. Независимо от того, являетесь ли вы любопытным разработчиком, делающим первые шаги в NestJS, или опытным программистом, стремящимся повысить уровень своей тестовой игры, это руководство предоставит вам необходимые знания для написания эффективных и увлекательных модульных тестов для ваших приложений NestJS.

Подготовка к этапу: понимание модульного тестирования

Прежде чем мы погрузимся в чудеса тестирования Jest, давайте уделим немного времени тому, чтобы понять, что такое модульное тестирование. Проще говоря, модульное тестирование включает тестирование отдельных модулей или компонентов вашего приложения изолированно, чтобы убедиться, что они функционируют должным образом. Этими единицами могут быть функции, классы или даже целые модули.

Представьте наше приложение NestJS как грандиозную театральную постановку, и каждый модульный тест подобен проверке игры актера во время репетиций. Оценивая их индивидуальное мастерство, мы обретаем уверенность, что вся пьеса станет хитом!

Начало работы с Jest и NestJS

Засучим рукава и начнем наше испытательное приключение! NestJS поставляется со встроенной поддержкой Jest, что делает его идеальной парой для написания модульных тестов. Для начала убедитесь, что в вашем проекте установлены NestJS и Jest:

npm install --save @nestjs/testing jest

Пишем наш первый тест

В этом увлекательном упражнении мы напишем наш первый модульный тест для проверки простого сервиса NestJS. Представьте себе SuperheroService, который вычисляет уровень силы супергероев на основе их атрибутов. Мы проверим этот мощный сервис:

// superhero.service.ts
import { Injectable } from '@nestjs/common';

@Injectable()
export class SuperheroService {
  calculatePowerLevel(strength: number, speed: number): number {
    return strength * speed * Math.random();
  }
}

Теперь пришло время показать наш тест в superhero.service.spec.ts:

import { Test, TestingModule } from '@nestjs/testing';
import { SuperheroService } from './superhero.service';

describe('SuperheroService', () => {
  let service: SuperheroService;

  beforeEach(async () => {
    const module: TestingModule = await Test.createTestingModule({
      providers: [SuperheroService],
    }).compile();

    service = module.get<SuperheroService>(SuperheroService);
  });

  it('should calculate the power level of superheroes', () => {
    const strength = 5;
    const speed = 10;
    const powerLevel = service.calculatePowerLevel(strength, speed);

    expect(powerLevel).toBeGreaterThanOrEqual(strength * speed);
    expect(powerLevel).toBeLessThanOrEqual(strength * speed * 10);
  });
});

Давайте погрузимся в этот удивительный код, посвященный тестированию нашего собственного SuperheroService в NestJS. Представьте, что вы тренер супергероев, и этот код поможет вам оценить уровень силы ваших супергероев!

Импорт важных зависимостей

import { Test, TestingModule } from '@nestjs/testing';
import { SuperheroService } from './superhero.service';

В этом разделе мы готовимся тренировать наших супергероев, импортируя необходимые инструменты. У нас есть Test и TestingModule из арсенала тестирования NestJS. Кроме того, мы ввели наш собственный «SuperheroService», который мы хотим протестировать. Это как иметь все крутые гаджеты для тренировки супергероев.

Настройка тренировочной арены

describe('SuperheroService', () => {
  let service: SuperheroService;

  beforeEach(async () => {
    const module: TestingModule = await Test.createTestingModule({
      providers: [SuperheroService],
    }).compile();

    service = module.get<SuperheroService>(SuperheroService);
  });

А теперь представьте, что это наша тренировочная арена для супергероев. Мы готовим все до начала тренировки. Мы создаем специальную арену для нашего «SuperheroService», используя Test.createTestingModule. Внутри этой арены мы предоставляем нашу «Супергеройскую услугу» в качестве одного из тренеров, чтобы помочь нашим супергероям стать сильнее!

Супергеройская тренировка

  it('should calculate the power level of superheroes', () => {
    const strength = 5;
    const speed = 10;
    const powerLevel = service.calculatePowerLevel(strength, speed);

    expect(powerLevel).toBeGreaterThanOrEqual(strength * speed);
    expect(powerLevel).toBeLessThanOrEqual(strength * speed * 10);
  });

Теперь пришло время для захватывающей части: силовой тренировки супергероев! Мы хотим увидеть, насколько сильны наши супергерои, верно? Итак, мы устанавливаем некоторые значения для силы и скорости. Затем мы вызываем функцию calculatePowerLevel нашего «SuperheroService» и сохраняем результат в powerLevel.

С помощью наших надежных утверждений expect мы проверяем, больше или равен уровень силы произведению силы и скорости (эй, нам нужны супергерои с сильными способностями!) и меньше или равен десятикратному произведению силы и скорости. скорость (но не слишком мощная, верно?).

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

Раскрывая силу матчеров

Теперь, когда наш первый тест прошел успешно, давайте перейдем к следующему уровню! Jest предлагает множество очаровательных сопоставителей, чтобы сделать наши тесты более выразительными и приятными для чтения. Давайте улучшим наш тест супергероев с помощью нескольких удивительных совпадений:

it('should calculate the power level of superheroes', () => {
  const strength = 5;
  const speed = 10;
  const powerLevel = service.calculatePowerLevel(strength, speed);

  expect(powerLevel).toBeGreaterThanOrEqual(strength * speed);
  expect(powerLevel).toBeLessThanOrEqual(strength * speed * 10);
  expect(service.calculatePowerLevel(0, speed)).toBe(0);
});

Асинхронное колдовство: тестирование асинхронного кода

В фантастическом мире программирования мы часто сталкиваемся с асинхронным кодом. Не бойтесь, поскольку NestJS и Jest предлагают волшебное решение для решения этой проблемы. Представьте себе TrainingService, который со временем усиливает способности супергероев. Давайте проверим его асинхронные возможности:

// training.service.ts
import { Injectable } from '@nestjs/common';

@Injectable()
export class TrainingService {
  async trainSuperhero(strength: number, durationInMinutes: number): Promise<number> {
    return new Promise((resolve) => {
      setTimeout(() => {
        resolve(strength + durationInMinutes * 0.1);
      }, durationInMinutes * 60 * 1000);
    });
  }
}

В нашем захватывающем тесте мы будем использовать заклинания async и await, чтобы проверить мощь TrainingService:

it('should enhance superhero power through training', async () => {
  const initialStrength = 10;
  const trainingDuration = 30; // minutes

  const trainedStrength = await service.trainSuperhero(initialStrength, trainingDuration);

  expect(trainedStrength).toBeCloseTo(initialStrength + trainingDuration * 0.1, 2);
});

Mocking Magic: тестирование с зависимостями

Иногда наши сервисы NestJS полагаются на другие волшебные сервисы (зависимости). Чтобы изолировать наши тесты от более широкой схемы вещей, мы используем искусство насмешки. Представьте, что нашему SuperheroService нужен импульс от SuperpowerService:

// superpower.service.ts
import { Injectable } from '@nestjs/common';

@Injectable()
export class SuperpowerService {
  getSuperpower(): string {
    const superpowers = ['Flight', 'Invisibility', 'Super Strength', 'Telepathy'];
    return superpowers[Math.floor(Math.random() * superpowers.length)];
  }
}

Чтобы протестировать SuperheroService, мы создадим магический макет для SuperpowerService и позволим нашим героям сиять:

it('should grant a random superpower to superheroes', () => {
  jest.spyOn(superpowerService, 'getSuperpower').mockReturnValueOnce('Super Strength');

  const strength = 5;
  const speed = 10;
  const superhero = service.createSuperhero('John Doe', strength, speed);

  expect(superhero.name).toBe('John Doe');
  expect(superhero.superpower).toBe('Super Strength');
});

Наконец, после написания тестовых случаев. Не забудьте запустить тестирование командой ввода в консоли:

npm test

Или запустите команду ниже, если вы используете yarn

yarn test

Заключение

Поздравляем, смелый новичок в NestJS! Теперь вы овладели искусством модульного тестирования с помощью Jest в очаровательном мире NestJS. Вооруженные мощью модульных тестов, ваши приложения будут более надежными и готовыми к любым вызовам, которые встречаются на их пути.

Помните, что тестирование — это приключение открытий и расширения возможностей. Примите это с открытым сердцем и пытливым умом, и ваше путешествие в качестве разработчика NestJS будет наполнено триумфами и волшебными творениями.

Удачного кодирования и пусть ваши тесты будут вечнозелеными!