node.js - Hur man mockar getMongoRepository i service nestjs
Jag skriver enhetstest för min tjänst i nestjs. I min funktion delete använder jag getMongoRepository för att ta bort. Men jag fastnar i att skriva enhetstestet
Jag har försökt skriva mocken men det fungerar inte
min tjänst
async delete(systemId: string): Promise<DeleteWriteOpResultObject> {
const systemRepository = getMongoRepository(Systems);
return await systemRepository.deleteOne({ systemId });
}
min förolämpning
import { Mock } from './mock.type';
import { Repository, getMongoRepository } from 'typeorm';
// @ts-ignore
export const mockRepositoryFactory: () => Mock<Repository<any>> = jest.fn(
() => ({
save: jest.fn(Systems => Systems),
delete: jest.fn(Systems => Systems),
deleteOne: jest.fn(Systems => Systems),
}),
);
mitt test
import { ExternalSystemService } from '../external-system.service';
import { Systems } from '../entities/external-system.entity';
module = await Test.createTestingModule({
providers: [
ExternalSystemService,
{
provide: getRepositoryToken(Systems),
useFactory: mockRepositoryFactory,
},
],
}).compile();
service = module.get<ExternalSystemService>(ExternalSystemService);
mockRepository = module.get(getRepositoryToken(Systems));
describe('delete', () => {
it('should delete the system', async () => {
mockRepository.delete.mockReturnValue(undefined);
const deletedSystem = await service.delete(systemOne.systemId);
expect(mockRepository.delete).toBeCalledWith({ systemId: systemOne.systemId });
expect(deletedSystem).toBe(Object);
});
Jag fick detta fel
ExternalSystemService › delete › ska inte ta bort systemet
ConnectionNotFoundError: Connection "default" was not found.
at new ConnectionNotFoundError (error/ConnectionNotFoundError.ts:8:9)
at ConnectionManager.Object.<anonymous>.ConnectionManager.get (connection/ConnectionManager.ts:40:19)
at Object.getMongoRepository (index.ts:300:35)
at Object.<anonymous> (external-system/tests/external-system.service.spec.ts:176:33)
at external-system/tests/external-system.service.spec.ts:7:71
at Object.<anonymous>.__awaiter (external-system/tests/external-system.service.spec.ts:3:12)
at Object.<anonymous> (external-system/tests/external-system.service.spec.ts:175:51)
Svar #1
Du bör undvika att använda globala funktioner och istället använda beroendeinjektionssystemet; detta gör testning mycket enklare och är en av huvudfunktionerna i Nest.
Nest TypeORM-modulen tillhandahåller redan ett bekvämt sätt att injicera ett repository:
1) Injicera lagret i din tjänsts konstruktor:
constructor(
@InjectRepository(Systems)
private readonly systemsRepository: MongoRepository<Systems>,
) {}
2) Använd det injicerade arkivet
async delete(systemId: string): Promise<DeleteWriteOpResultObject> {
return this.systemsRepository.deleteOne({ systemId });
}
Nu kommer ditt mockade repository att användas i ditt test.
