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

使用Jest对TypeORM中的AWS SES进行Mock测试时遇错求助

解决Jest测试AWS SES时的TypeError问题

问题根源

你遇到的TypeError: mSes.sendEmail(...).promise.mockRejectedValueOnce is not a function错误,本质是因为你mock的sendEmail方法返回的对象中,promise不是一个Jest mock函数,导致无法调用mock专属的方法。

正确Mock方案

要让SES的sendEmail返回带有mockpromise方法的对象,以下是具体实现步骤:

1. 全局Mock AWS SDK

在测试文件顶部,用jest.mock正确mock AWS.SES模块,确保sendEmail返回的对象包含mock的promise函数:

jest.mock('aws-sdk', () => {
  // 定义mock的promise函数
  const mockPromise = jest.fn();
  return {
    SES: jest.fn(() => ({
      sendEmail: jest.fn(() => ({
        // 让sendEmail返回的对象拥有mock的promise方法
        promise: mockPromise
      }))
    }))
  };
});

2. 编写测试用例

在测试逻辑中,你可以通过控制mockPromise的状态来测试成功/失败场景:

const AWS = require('aws-sdk');
const mailService = require('./path-to-your-mail-service');

describe('sendMail 方法测试', () => {
  let mockSesInstance;
  let mockPromise;

  beforeEach(() => {
    // 重置所有mock,避免用例间污染
    AWS.SES.mockClear();
    // 获取SES的mock实例
    mockSesInstance = AWS.SES.mock.instances[0];
    // 获取sendEmail返回对象中的mock promise
    mockPromise = mockSesInstance.sendEmail.mock.results[0].value.promise;
    mockPromise.mockClear();
  });

  it('处理SES发送失败的情况', async () => {
    // 设置promise拒绝状态
    const testError = new Error('SES发送失败');
    mockPromise.mockRejectedValueOnce(testError);

    // 验证异步方法是否抛出预期错误
    await expect(mailService.sendMail({
      // 传入测试用的邮件参数
      Source: 'test@example.com',
      Destination: { ToAddresses: ['user@example.com'] },
      Message: { Subject: { Data: 'Test' }, Body: { Text: { Data: 'Test content' } } }
    })).rejects.toThrow(testError);

    // 验证sendEmail是否被正确调用
    expect(mockSesInstance.sendEmail).toHaveBeenCalledWith(/* 这里填你预期的参数 */);
  });

  it('处理SES发送成功的情况', async () => {
    // 设置promise成功状态
    mockPromise.mockResolvedValueOnce({ MessageId: 'test-message-id' });

    const result = await mailService.sendMail(/* 测试参数 */);

    expect(result.MessageId).toBe('test-message-id');
    expect(mockSesInstance.sendEmail).toHaveBeenCalled();
  });
});

常见误区提醒

  • 不要只mockSES类或sendEmail方法,忽略sendEmail返回对象中的promise方法,必须让promise成为Jest mock函数才能使用mockRejectedValueOnce/mockResolvedValueOnce
  • 每次测试前务必重置mock,避免前一个用例的mock状态影响当前用例
  • 验证调用链时,要确保SES实例被正确创建、sendEmail被调用、promise方法也被执行

内容的提问来源于stack exchange,提问作者Anto P V

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 08:10:28