javascript - Jest 无法检测到模拟函数调用
问题描述
我正在为 Express 应用程序的控制器上的一个编写单元测试。我正在模拟res.send
方法,并希望在用户传递有效数据时调用它,如下所示:
describe('>> CONTROLLERS -- Exercise -- deleteExercise', () => {
let res
beforeEach(() => {
res = {
send : jest.fn()
}
});
it('sends error as response if id was not passed', () => {
const req = {
body : {}
}
deleteExercise(req, res)
expect(res.send).toHaveBeenCalledWith({
error : 'please pass id field to delete the exercise.'
})
})
it('calls the deleteExercise class method if the id was passed', () => {
const req = {
body : {
id : 1234
}
}
deleteExercise(req, res)
expect(Exercise.deleteExercise).toHaveBeenCalledWith(1234)
expect(res.send).toHaveBeenCalled()
// expect(res.send).toHaveBeenCalledWith(mockData)
})
})
第一个测试运行良好,但第二个不是。我添加了控制台来检查是否res.send
被调用,在代码中它被调用,但 Jestexpect(res.send).toHaveBeenCalled()
测试失败。你能帮我解决我在这里缺少的东西吗......
解决方案
在花了一些时间进行调试之后,我认为您还需要为您的模拟响应提供状态。
mockResponse = {
send : jest.fn()
status: jest.fn(() => mockResponse),
}
describe('>> CONTROLLERS -- Exercise -- deleteExercise', () => {
let mockResponse
beforeEach(() => {
mockResponse = {
send : jest.fn()
status: jest.fn(() => mockResponse),
}
});
afterEach(() => {
jest.clearAllMocks();
});
it('sends error as response if id was not passed', () => {
const mockRequest = {
body : {}
}
deleteExercise(mockRequest, mockResponse)
expect(mockResponse.send).toHaveBeenCalledWith({
error : 'please pass id field to delete the exercise.'
})
})
it('calls the deleteExercise class method if the id was passed', () => {
const mockRequest = {
body : {
id : 1234
}
}
deleteExercise(mockRequest, mockResponse)
// deleteExercise is called with req, res arguments
expect(Exercise.deleteExercise).toHaveBeenCalled()
expect(Exercise.deleteExercise).toHaveBeenCalledWith(mockRequest, mockResponse)
expect(Exercise.deleteExercise).toHaveBeenCalledTimes(1)
expect(mockResponse.send).toHaveBeenCalled()
expect(mockResponse.send).toHaveBeenCalledWith(1234)
expect(mockResponse.send).toHaveBeenCalledTimes(1)
})
})
deleteExercise
函数是用res
and调用的,而req
不是用id
. 首先,检查是否调用了 deleteExercise,然后检查是否使用参数调用了相同的函数。然后稍后检查该函数被调用了多少次。
还有一件事,在每个测试用例之后清除所有模拟。
afterEach(() => {
jest.clearAllMocks();
});
推荐阅读
- javascript - 事件 preventDefault 后无法提交表单
- tensorflow - 在张量流中加载 MobileNetv2 FasterRCNN 的预训练模型
- c++ - windows系统加入Azure AD时获取登录用户的UserPrincipalName
- django - django not found 无限循环
- javascript - ReactJS:防止 href 替换 URL 哈希值(令牌)
- r - 在火山图中添加自定义图例
- cobol - 如何计算文件中的总记录,同时只显示一些?
- python - 如何在kivy中动态调整窗口大小?
- java - 如何在子包中扩展抽象类?
- android - 如何在 Android 设备上使用 React Native Webview 请求麦克风权限