Подмена зависимости в Nest
Сервис тянет за собой базу, почту или внешний API, а проверке нужен нужна только одна строка ответа. Поднимать все связи ради одной строки долго и хрупко: сбой соседа ломает сценарий, который к нему не относится.
В записи провайдера вместо класса
указывают useValue и передают
готовый объект с нужными полями.
Контейнер отдаёт его по тому же
токену, что и живой сервис.
Так отрезают соседние сервисы
и базу от сценария, которому
нужен только контракт токена.
Покажем на примере постов:
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 mock', () => {
it('uses stub value', async () => {
const stub = {
getPosts: () => 'Stub posts',
};
const moduleRef = await Test.createTestingModule({
providers: [
{ provide: PostService, useValue: stub },
],
}).compile();
const service = moduleRef.get(PostService);
expect(service.getPosts()).toBe('Stub posts');
});
});
Запуск:
npx vitest run test/post.mock.spec.ts
Подмените WorkerService
объектом с другой строкой списка
в тестовом модуле и проверьте,
что контейнер возвращает эту строку.