首页 > 解决方案 > Jest - 快速测试

问题描述

我有一个用于执行此操作的简单汽车买卖 API 的控制器

async processCarSale(@Res() res: any) {
    if(carSaleService.sale()) {
        return res.status(201).send(<some-body>);
    }
    return res.status(204).send(<some-other-body>);
}

我正在尝试通过单元测试来测试状态代码是否设置正确。谷歌搜索和使用所以我发现了类似于这个的例子

const mockResponse = {
    status: jest.fn(),
    send: jest.fn()
}
const mockResponseSent = { send: jest.fn() };
mockResponse.status = jest.fn(() => mockResponseSent);

await carController.processCarSale(response);
expect(response.statusCode).toBe(200);

然而,这似乎并没有真正测试状态代码。

有什么方法可以测试通过 Express 在响应中发送的 statusCode 吗?

标签: expressjestjsnestjs

解决方案


您的模拟不会设置一个名为 的值statusCode,它只是存根功能并返回相同的对象,以便send()也可以调用它(也是存根)。如果您希望能够测试类似的东西res.statusCode === 200,可以执行以下操作:

const mockResponse = {
    status: jest.fn(),
    send: jest.fn(),
    statusCode: 0
}
const mockResponseSent = { send: jest.fn() };
mockResponse.status = jest.fn(() => {
  mockResponseSent.statusCode = 200;
  return mockResponseSent;
});

await carController.processCarSale(response);
expect(response.statusCode).toBe(200);

但是,这实际上只是首先重写控制器的逻辑,这并不是很好。那么更好的办法是利用 Jest 的mockImplementation()方法,你可以做

const mockResponse = {
    status: jest.fn(),
    send: jest.fn()
}
const mockResponseSent = { send: jest.fn() };
mockResponse.status = jest.fn().mockImplementation((status) => {
  mockResponseSent.statusCode = status;
  return mockResponseSent;
});

await carController.processCarSale(response);
expect(response.statusCode).toBe(200);

不过,总的来说,我建议放弃res在您的控制器中使用 ,并建议让 Nest 处理 http 状态代码的设置并发送响应。您可以通过使用将代码设置为默认值以外的其他内容@HttpCode()


推荐阅读