You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jest模拟@sendgrid/mail模块无效,测试仍调用真实模块

Jest第三方模块Mock不生效的排查与解决

针对你遇到的@sendgrid/mail和Google Secret Manager模块Mock不生效、始终调用真实模块的问题,可以按以下方向排查:

1. 修正模块导入与Mock的顺序

Jest会自动提升jest.mock调用到模块顶部,但如果代码中先导入了被Mock的模块或依赖它的业务代码,可能导致Mock无法覆盖真实模块。确保jest.mock在所有相关import之前执行:

import { jest } from '@jest/globals';

// 先执行Mock,再导入模块
jest.mock('@sendgrid/mail');

import sgMail from '@sendgrid/mail';
import { sendEmail } from './functions.js';

describe('functions.js', () => {
  test('email subject is generated correctly', async () => {
    await sendEmail('test');
    expect(sgMail.send).toHaveBeenCalled();
  });
});

2. 适配ES模块的Mock格式

如果第三方模块是ES模块格式,手动Mock时要保证导出结构一致:

  • 在项目根目录创建__mocks__/@sendgrid/mail.js文件:
// 模拟默认导出的结构
const mockSgMail = {
  send: jest.fn().mockResolvedValue({ statusCode: 202 })
};
export default mockSgMail;
  • 若使用工厂函数Mock,需指定__esModule: true:
jest.mock('@sendgrid/mail', () => ({
  __esModule: true,
  default: {
    send: jest.fn()
  }
}));

3. 清理Jest缓存

Jest的模块缓存可能导致旧的真实模块未被替换,执行以下命令清除缓存后重新测试:

jest --clearCache

4. 检查业务代码的导入方式

确保sendEmail函数中是顶部静态导入第三方模块,而非函数内部动态require或动态导入,否则会绕过Jest的Mock:

// 正确写法:顶部导入
import sgMail from '@sendgrid/mail';

export async function sendEmail(content) {
  await sgMail.send({
    to: 'test@example.com',
    from: 'sender@example.com',
    subject: 'Test',
    text: content
  });
}

5. 验证Jest配置与版本

  • 确保Jest版本在28及以上,对ES模块的Mock支持更完善;
  • 在jest.config.js中添加ES模块相关配置:
module.exports = {
  testEnvironment: 'node',
  transform: { '^.+\\.js$': 'babel-jest' },
  extensionsToTreatAsEsm: ['.js'],
  moduleNameMapper: {
    '^(\\.{1,2}/.*)\\.js$': '$1'
  }
};

6. 单独测试排除干扰

单独运行当前测试文件,排除其他测试的缓存或Mock冲突:

jest your-test-file.test.js --runInBand

内容的提问来源于stack exchange,提问作者tristansokol

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 15:53:11