Unit testing 如何使用jest在代码中更深层地模拟函数

Unit testing 如何使用jest在代码中更深层地模拟函数,unit-testing,jestjs,Unit Testing,Jestjs,我试图模仿这个邮件功能,所以我不会每次测试代码时都发送邮件。但这种嘲弄是行不通的。这段代码给了我一个错误:mockImplementation不是一个函数 是add函数调用sendUserInvitationMail()。邮件程序模块导出如下所示: module.exports = { sendUserInvitationMail, }; 这是测试代码: require('dotenv').config(); const { startWithCleanDb } = require('..

我试图模仿这个邮件功能,所以我不会每次测试代码时都发送邮件。但这种嘲弄是行不通的。这段代码给了我一个错误:mockImplementation不是一个函数

是add函数调用sendUserInvitationMail()。邮件程序模块导出如下所示:

module.exports = {
  sendUserInvitationMail,
};
这是测试代码:

require('dotenv').config();
const { startWithCleanDb } = require('../../../utils/test.helpers');
const { add } = require('../invitation.service');
const { ADMIN_LEVELS, TABLES } = require('../../../constants');
const { AuthorizationError } = require('../../../errors');
const knex = require('../../../../db/connection');
const mailer = require('../../../mailer/index');

jest.mock('../../../mailer/index');

beforeEach(() => startWithCleanDb());


mailer.sendUserInvitationMail.mockImplementation(() => console.log('Mocked mail function called'));

mailer.sendUserInvitationMail();

describe('invitation.service', () => {
  describe('add', () => {
    it('adds an invitation to the db', async () => {
      expect.assertions(2);
      const result = await add(
        {
          email: 'tester@test.be',
          badgeNumber: '344d33843',
        },
        { currentZoneId: 1 },
        ADMIN_LEVELS.ADMINISTRATOR,
      );
      const invitation = (await knex.select('*').from(TABLES.INVITATIONS))[0];
      expect(invitation.id).toEqual(result.id);
      expect(invitation.email).toEqual(result.email);
    });

  });
});

mailer
中,
sendUserInvitationMail
未定义的
,因此它没有属性
mockImplementation

尝试:


这适用于我在测试文件中进行的一次调用。但是未经修改的sendUserInvitationMail仍然会被add函数调用。在这种情况下,您的模拟邮件可能看起来像
module.exports={sendUserInvitationMail:()=>{}}
,这就是它的含义,但使用速记,请参见OP.@RobIndesteege如果您将实现提供给
jest.mock
,它是否有效
jest.mock(…,()=>({sendUserInvitationMail:jest.fn(…)}))
mailer.sendUserInvitationMail = jest.fn().mockImplementation(() => console.log('Mocked mail function called'));
mailer.sendUserInvitationMail = jest.fn(() => console.log('Mocked mail function called'));