使用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(); }); });
常见误区提醒
- 不要只mock
SES类或sendEmail方法,忽略sendEmail返回对象中的promise方法,必须让promise成为Jest mock函数才能使用mockRejectedValueOnce/mockResolvedValueOnce - 每次测试前务必重置mock,避免前一个用例的mock状态影响当前用例
- 验证调用链时,要确保
SES实例被正确创建、sendEmail被调用、promise方法也被执行
内容的提问来源于stack exchange,提问作者Anto P V
相关产品推荐
相关产品推荐

