如何在单元测试 Nest.js 中测试抛出新的 HttpException

Posted

技术标签:

【中文标题】如何在单元测试 Nest.js 中测试抛出新的 HttpException【英文标题】:How to test throw new HttpException in unit test Nest.js 【发布时间】:2020-05-23 21:09:06 【问题描述】:

我正在尝试在我的 Nest.js 应用中测试服务。在此服务的某些方法中,我会根据上下文抛出新的 HttpException。

我正在尝试编写这些方法的单元测试,但我不知道如何测试我抛出 HttpException 的用例。

我试过这段代码:

it('Shound return error for a non existing id provided', async () => 
      await expect(service.getUser('false Id')).rejects.toThrow(new HttpException('This user does not exist', 404));
);

但我收到了:

Expected the function to throw an error matching:
      [Error: This user does not exist]
    Instead, it threw:
      Error: This user does not exist

有人遇到过这个用例吗?

【问题讨论】:

你在service.getUser() 中抛出了什么错误? NotFoundException 还是 HttpException?请注意,您也可以仅使用 toThrow('This user ...') 测试错误消息 我在 service.getUser() 中抛出了 HttpException。我尝试过这样的测试:await expect(service.getUser('false Id')).toThrow('This user does not exist'); 或类似的测试:await expect(service.getUser('false Id')).rejects.toThrow('This user does not exist'); 但这些解决方案似乎都不起作用。 我终于决定不在单元测试中而是在端到端测试中测试 throw HttpException 你试过了吗? ***.com/a/54206825/3910390 【参考方案1】:

只需这样做:

  it('should return null when update', async (done) => 
    jest.spyOn(service, 'updateById').mockResolvedValue(null)

    try 
      await controller.updateById( id: 'some id' , )
     catch (error) 
      expect(error).toBeInstanceOf(NotFoundException)
      done()
    
  )

【讨论】:

【参考方案2】:

Duc 答案有效,但如果你想要一些更漂亮的方式,你可能会喜欢这个,

 it('should return null when update', async () => 

  await expect(controller.updateById( id: 'some id' , ))
  .rejects.toThrowError(NotFoundException);

);

【讨论】:

以上是关于如何在单元测试 Nest.js 中测试抛出新的 HttpException的主要内容,如果未能解决你的问题,请参考以下文章

单元测试 Nest JS 过滤器捕获方法

如何在 Jasmine 中对“throw new Error()”子句进行单元测试

Nest JS - 为返回 Observable Axios 响应的函数编写 Jest 测试用例的问题

检查单元测试中是不是抛出参数

运行测试单元时出现 VUE 错误

Nest.js Fastify 测试 TypeError: app.address is not a function