Подмена базы в Nest
Сервис читает строки через репозиторий, и прогон проверок не должен требовать живой PostgreSQL на каждой машине. Подключение к базе замедляет сценарий и делает его зависимым от сети и от данных в таблице.
Токен репозитория для сущности
берут через getRepositoryToken
из @nestjs/typeorm. В провайдерах
тестового модуля передают useValue
с объектом, у которого те же
операции, что нужны сервису.
Сервис получает заглушку и не
открывает соединение.
Покажем на примере постов:
import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm';
@Entity()
export class Post {
@PrimaryGeneratedColumn()
id: number;
@Column()
title: string;
}
Сервис читает список через репозиторий:
import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { Post } from './post.entity.js';
@Injectable()
export class PostService {
postRepository: Repository<Post>;
constructor(
@InjectRepository(Post) postRepository: Repository<Post>,
) {
this.postRepository = postRepository;
}
async findAll() {
return this.postRepository.find();
}
}
Заглушка репозитория и проверка сервиса:
import { describe, it, expect } from 'vitest';
import { Test } from '@nestjs/testing';
import { getRepositoryToken } from '@nestjs/typeorm';
import { PostService } from '../src/post.service.js';
import { Post } from '../src/post.entity.js';
describe('PostService with mock repository', () => {
it('returns rows from stub', async () => {
const stub = {
find: async () => [{ id: 1, title: 'Morning note' }],
};
const moduleRef = await Test.createTestingModule({
providers: [
PostService,
{ provide: getRepositoryToken(Post), useValue: stub },
],
}).compile();
const service = moduleRef.get(PostService);
const rows = await service.findAll();
expect(rows).toEqual([{ id: 1, title: 'Morning note' }]);
});
});
Запуск:
npx vitest run test/post.repository.mock.spec.ts
Подмените репозиторий сущности
работника объектом с готовым
списком строк и проверьте, что
WorkerService возвращает
эти данные без PostgreSQL.