express - 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 吗?
解决方案
您的模拟不会设置一个名为 的值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()
推荐阅读
- javascript - 当光标不在材料cdk拖放中的放置区域时删除放置区域的占位符
- db2 - DB2 将大型物理表与小型全局临时表连接起来
- android - 在嵌套滚动视图中使用分页库时会加载所有数据
- android - 使用 MVVM 在 Android 中验证权限的优雅方式
- r - 根据 R 中数据框中的列展开数据框
- c# - Webapi AuthorizeAttribute 不允许我在将状态消息设为 200 时访问方法
- c# - 如何将数据库连接到我的桌面应用程序,而两者都放置在不同的系统中?
- react-native - react native输入输入框时如何在键盘上方设置文本输入框
- angular - 如何选择在页面上以角度显示的组件?
- ios - UIDatepicker 设置最小分钟