gpt4 book ai didi

node.js - 如何在服务 nestjs 中模拟 getMongoRepository

转载 作者:可可西里 更新时间:2023-11-01 10:36:08 27 4
gpt4 key购买 nike

我在 nestjs 中为我的服务编写单元测试。在我的删除函数中,我使用 getMongoRepository 来删除。但是我坚持编写单元测试

我试过写模拟,但没用

我的服务

 async delete(systemId: string): Promise<DeleteWriteOpResultObject> {
const systemRepository = getMongoRepository(Systems);
return await systemRepository.deleteOne({ systemId });
}

我的模拟

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),
}),
);

我的测试

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);
});

我遇到了这个错误

ExternalSystemService › delete › 不应删除系统

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)

最佳答案

您应该避免使用全局函数,而是使用 dependency injection系统;这使测试变得更加容易,并且是 nest 的主要功能之一。

鸟巢typeorm module已经提供了injecting a repository的便捷方式:

1) 在服务的构造函数中注入(inject)存储库:

constructor(
@InjectRepository(Systems)
private readonly systemsRepository: MongoRepository<Systems>,
) {}

2) 使用注入(inject)的仓库

async delete(systemId: string): Promise<DeleteWriteOpResultObject> {
return this.systemsRepository.deleteOne({ systemId });
}

现在您的 mocked repository将在您的测试中使用。

关于node.js - 如何在服务 nestjs 中模拟 getMongoRepository,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57155874/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com