Тест контроллера в Nest
Страница только передаёт вызов во внедрённый класс, и ошибка может сидеть в связке, а не в тексте ответа. Гонять HTTP ради одной строки из сервиса избыточно, если сервис уже можно подставить объектом.
Тестовый модуль регистрирует
контроллер и провайдер сервиса
через useValue. После
compile из контейнера
берут экземпляр контроллера
и обращаются к странице так же,
как это делает фреймворк
при обращении клиента.
Покажем на примере постов:
import { Controller, Get } from '@nestjs/common';
import { PostService } from './post.service.js';
@Controller()
export class PostController {
postService: PostService;
constructor(postService: PostService) {
this.postService = postService;
}
@Get('posts')
getPosts(): string {
return this.postService.getPosts();
}
}
Заглушка сервиса и проверка ответа страницы:
import { describe, it, expect } from 'vitest';
import { Test } from '@nestjs/testing';
import { PostController } from '../src/post.controller.js';
import { PostService } from '../src/post.service.js';
describe('PostController', () => {
it('returns stubbed posts', async () => {
const stub = {
getPosts: () => 'Stub posts',
};
const moduleRef = await Test.createTestingModule({
controllers: [PostController],
providers: [
{ provide: PostService, useValue: stub },
],
}).compile();
const controller = moduleRef.get(PostController);
expect(controller.getPosts()).toBe('Stub posts');
});
});
Запуск:
npx vitest run test/post.controller.spec.ts
Соберите тестовый модуль с
WorkerController и заглушкой
WorkerService, затем проверьте,
что страница возвращает строку
из подмены.