我有一个控制器模块,该模块依赖于服务模块并在内部调用它。 我正在测试的模块是控制器,我想对其进行独立测试,因此我模拟了控制器所依赖的服务功能。但是控制器调用的是原始函数,而不是模拟函数。
我已经阅读了文档和其他问题,并捆绑了许多方法,但是都没有效果
这是我最近的尝试:
const teacherDB = jest.genMockFromModule('./teacher-db')
teacherDB.getCoursesOfTeacher = jest.fn(id => {
logger.debug('MOCKED!')
return 'FAKE'
})
const teacherController = require('./teacher-controller')
const res = {}
res.send = jest.fn()
res.status = jest.fn(obj => res)
//Here is where I call a function that is dependent on a teacherDB function (one that is mocked)
// I mocked it but it calls the original instead of mocked version above
await teacherController.getCoursesOfTeacher({
params: {
id: new Types.ObjectId()
}
}, res)
expect(res.send).toHaveBeenCalled()
expect(res.send).toHaveBeenLastCalledWith(expect.objectContaining({
code: 2
}))
})
我希望得到代码2(成功,这意味着我的函数不依赖于我的TeacherDB,而是调用了模拟版本) 但是我得到了代码4(这意味着id不存在,如果我叫TeacherDB,那是正确的)
答案 0 :(得分:1)
genMockFromModule不是本例中要查找的内容,它只是从模块中创建一个模拟,实际上并没有在全局范围内对其进行模拟-您需要jest.mock
const teacherDB = require('./teacher-db');
const teacherController = require('./teacher-controller');
// mock DB the module
jest.mock('./teacher-db');
test('test mock', async () => {
teacherDB.getCoursesOfTeacher.mockResolvedValue('FAKE');
const res = {
send: jest.fn(),
status: jest.fn(() => res)
};
await teacherController.getCoursesOfTeacher({
params: {
id: new Types.ObjectId()
}
}, res);
expect(res.send).toHaveBeenCalled()
expect(res.send).toHaveBeenLastCalledWith(expect.objectContaining({
code: 2
}));
});
答案 1 :(得分:0)
通过将服务模块添加到控制器模块的导出中,然后对其进行模拟来对其进行修复:
const teacherController = require('./teacher-controller')
teacherController.teacherDB.getCoursesOfTeacher = jest.fn(id => {
return 'FAKE'
})
它奏效了,但是我不确定是否有更好的方法,所以我不会选择我的答案作为最佳答案。