嘲笑其他模块中的函数依赖

时间:2019-07-10 13:59:09

标签: javascript node.js jestjs

我有一个控制器模块,该模块依赖于服务模块并在内部调用它。 我正在测试的模块是控制器,我想对其进行独立测试,因此我模拟了控制器所依赖的服务功能。但是控制器调用的是原始函数,而不是模拟函数。

我已经阅读了文档和其他问题,并捆绑了许多方法,但是都没有效果

这是我最近的尝试:


    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,那是正确的)

2 个答案:

答案 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'
})

它奏效了,但是我不确定是否有更好的方法,所以我不会选择我的答案作为最佳答案。