node.js - NestJS'te (Typeorm & Jest) Repository, Servis ve Kontrolcü Nasıl Mock Edilir
Ben Typescript konusunda yeniyim. Nestjs projemin uygulaması şöyle bir şey. Repository desenini kullanmaya çalışıyorum, bu yüzden iş mantığını (service) ve kalıcılık mantığını (repository) ayırdım.
KullanıcıDeposu
import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { UserEntity } from './entities/user.entity';
@Injectable()
export class UserRepo {
constructor(@InjectRepository(UserEntity) private readonly repo: Repository<UserEntity>) {}
public find(): Promise<UserEntity[]> {
return this.repo.find();
}
}
KullanıcıServisi
import { Injectable } from '@nestjs/common';
import { UserRepo } from './user.repository';
@Injectable()
export class UserService {
constructor(private readonly userRepo: UserRepo) {}
public async get() {
return this.userRepo.find();
}
}
KullanıcıKontrolcüsü
import { Controller, Get } from '@nestjs/common';
import { UserService } from './user.service';
@Controller('/users')
export class UserController {
constructor(private readonly userService: UserService) {}
// others method //
@Get()
public async getUsers() {
try {
const payload = this.userService.get();
return this.Ok(payload);
} catch (err) {
return this.InternalServerError(err);
}
}
}
Veriyi veritabanına gerçekten kaydetmeden veya almadan (mock kullanarak) repository, servis ve controller için birim testi nasıl oluşturabilirim?
Cevap #1
NestJS'te taklit (mocking) yapmak, Nest'in sunduğu test araçları @nestjs/testing kullanılarak oldukça kolay ulaşılabilir. Kısacası, taklit etmek istediğiniz bağımlılık için bir Özel Sağlayıcı (Custom Provider) oluşturmak isteyeceksiniz ve hepsi bu. Ancak, her zaman bir örneğini görmek daha iyidir, bu yüzden işte bir kontrolör için bir taklit olasılığı:
describe('UserController', () => {
let controller: UserController;
let service: UserService;
beforeEach(async () => {
const moduleRef = await Test.createTestingModule({
controllers: [UserController],
providers: [
{
provide: UserService,
useValue: {
get: jest.fn(() => mockUserEntity) // really it can be anything, but the closer to your actual logic the better
}
}
]
}).compile();
controller = moduleRef.get(UserController);
service = moduleRef.get(UserService);
});
});
Ve oradan testlerinizi yazmaya devam edebilirsiniz. Bu, Nest'in DI sistemi kullanılarak yapılan tüm testlerde neredeyse aynı kurulumdur, dikkat etmeniz gereken tek şey @InjectRepository() ve @InjectModel() (Mongoose ve Sequelize dekoratörleri) gibi şeylerdir; bu durumda enjeksiyon token'ı için getRepositoryToken() veya getModelToken() kullanmanız gerekecektir. Daha fazla örnek arıyorsanız bu depoya göz atabilirsiniz.
