Typescript 控制器的NestJS单元测试:模拟从服务中删除不工作

Typescript 控制器的NestJS单元测试:模拟从服务中删除不工作,typescript,unit-testing,nestjs,Typescript,Unit Testing,Nestjs,我目前正在对我的NestJS服务进行单元测试。我的实体称为“用户”,我建立了一个基本服务,允许我与MS SQL server交互,在控制器中建立GET和POST端点 我的控制器文件中有一个delete方法,它基本上只是从我的服务中调用delete方法: @Injectable() export class ServiceName { constructor(@InjectEntityManager() private manager: EntityManager) {} async

我目前正在对我的NestJS服务进行单元测试。我的实体称为“用户”,我建立了一个基本服务,允许我与MS SQL server交互,在控制器中建立GET和POST端点

我的控制器文件中有一个
delete
方法,它基本上只是从我的服务中调用
delete
方法:

@Injectable()
export class ServiceName {
  constructor(@InjectEntityManager() private manager: EntityManager) {}


  async delete(id: number): Promise<any> {
    return await this.manager.delete(User, id);
  }
// some other functions 

以下是我的spec.ts文件中的测试用例:

    const mockService = {
        delete: jest.fn(),
    };

    beforeEach(async () => { 
        const module: TestingModule = await Test.createTestingModule({
            controllers: [ControllerName],
            providers: [ServiceName],
        })
            .overrideProvider(ServiceName)
            .useValue(mockService) 
            .compile();

        service = module.get<ServiceName>(ServiceName);
        controller = module.get<ControllerName>(ControllerName);
    });
        it('testing delete', async () => {
            mockService.delete.mockReturnValue(5);
            expect(controller.delete(5)).toEqual(5);
        }) 
上述测试用例失败,下面显示错误消息:

    expect(received).toEqual(expected) // deep equality

    Expected: 5
    Received: {}

      122 |         it('testing delete', async () => {
      123 |             mockService.delete.mockReturnValue(5);
    > 124 |             expect(controller.delete(5)).toEqual(5);
          |                                          ^
      125 |         })
      126 |     });
      127 | });

非常感谢您的帮助

作为提示,虽然您可以直接通过
提供者
,但我建议在单元测试中提供提供者的模拟。因此,您不必拥有
提供者:[ServiceName]

{
提供:ServiceName,
使用价值:{
删除:jest.fn().mockResolvedValue(5)
}
}

这样,您就可以从测试中了解所使用的一切。此外,当提供者有自己的依赖项时,此模式将防止您遇到问题,这些依赖项可能需要模拟,也可能不需要模拟。有关更多示例,请向我们展示您的
控制器。删除
方法btw
serviceName。删除
是异步的,因此您需要在
控制器上使用和使用wait。删除
返回成功!出于某种原因,使用
.mockResolvedValue
使测试通过。非常感谢你,迈克尔!