Запрос в сквозном тесте в Nest
Клиент присылает JSON при создании записи, и важно не только открыть адрес, но и вернуть то же содержимое или подтверждение. Проверка одного кода ответа не ловит ошибку в теле или в заголовке типа.
supertest цепочкой задаёт
тип запроса, путь, заголовок и тело,
затем сравнивает статус и текст
ответа. Приложение по-прежнему
собирают через createTestingModule
и createNestApplication,
чтобы маршрутизация была настоящей.
Покажем на примере постов:
import { Body, Controller, Post } from '@nestjs/common';
import { PostService } from './post.service.js';
@Controller('posts')
export class PostController {
postService: PostService;
constructor(postService: PostService) {
this.postService = postService;
}
@Post()
createPost(@Body() body: { title: string }) {
return this.postService.createPost(body.title);
}
}
import { Injectable } from '@nestjs/common';
@Injectable()
export class PostService {
createPost(title: string) {
return { title };
}
}
Корневой модуль регистрирует оба класса:
import { Module } from '@nestjs/common';
import { PostController } from './post.controller.js';
import { PostService } from './post.service.js';
@Module({
controllers: [PostController],
providers: [PostService],
})
export class AppModule {}
Сценарий шлёт JSON и сверяет тело:
import { describe, it, beforeEach, afterEach } from 'vitest';
import { Test } from '@nestjs/testing';
import { INestApplication } from '@nestjs/common';
import request from 'supertest';
import { AppModule } from '../src/app.module.js';
describe('Post create (e2e)', () => {
let app: INestApplication;
beforeEach(async () => {
const moduleRef = await Test.createTestingModule({
imports: [AppModule],
}).compile();
app = moduleRef.createNestApplication();
await app.init();
});
afterEach(async () => {
await app.close();
});
it('POST /posts with body', async () => {
await request(app.getHttpServer())
.post('/posts')
.send({ title: 'Morning note' })
.set('Content-Type', 'application/json')
.expect(201)
.expect({ title: 'Morning note' });
});
});
Запуск:
npx vitest run test/post-create.e2e.spec.ts
Добавьте создание работника по адресу с JSON телом и проверьте в сквозном сценарии, что ответ содержит переданное имя.