Тест сервиса в Nest
Логика списка живёт в отдельном классе, и после правки хочется узнать результат сразу, не открывая браузер и не поднимая весь сервер. Ручной обход адресов не покрывает каждую ветку внутри сервиса.
Пакет @nestjs/testing даёт
фабрику Test.createTestingModule:
в неё передают список провайдеров,
вызывают compile и получают
готовый контейнер. Из него через
get достают экземпляр
сервиса и проверяют возвращаемое
значение. Сценарий пишут в Vitest,
раннер vitest выполняет
блоки describe и it.
Покажем на примере постов:
npm install vitest @nestjs/testing
Сервис отдаёт готовую строку списка:
import { Injectable } from '@nestjs/common';
@Injectable()
export class PostService {
getPosts(): string {
return 'All posts';
}
}
Тест собирает модуль только с этим провайдером и сравнивает ответ сервиса с ожиданием:
import { describe, it, expect } from 'vitest';
import { Test } from '@nestjs/testing';
import { PostService } from '../src/post.service.js';
describe('PostService', () => {
it('returns all posts', async () => {
const moduleRef = await Test.createTestingModule({
providers: [PostService],
}).compile();
const service = moduleRef.get(PostService);
expect(service.getPosts()).toBe('All posts');
});
});
Запуск одного файла:
npx vitest run test/post.service.spec.ts
Напишите проверку для WorkerService,
которая собирает тестовый модуль
с этим провайдером и сравнивает
строку списка работников с ожиданием.