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

使用Jest的spyOn mock AWS SNS publish调用出现Cannot spyOn错误如何解决

错误原因

你代码中的sns是通过new AWS.SNS()生成的实例对象,只有构造函数才拥有prototype属性,实例本身不存在prototype,所以sns.prototype的值为undefined,jest.spyOn接收undefined作为第一个参数就会抛出你遇到的报错。
你之前DynamoDB的写法能够成功,是因为你spy的是dynamodb.DocumentClient这个构造函数的原型,符合spyOn的参数要求。

修复方案

直接修改beforeAll中对publishSpy的定义,改为spy SNS构造函数的原型即可:

beforeAll(() => { 
    putSpy = jest.spyOn(dynamodb.DocumentClient.prototype, 'put'); 
    // 改为spy AWS.SNS构造函数的原型
    publishSpy = jest.spyOn(AWS.SNS.prototype, 'publish')
}); 

之后你可以和mock DynamoDB的put方法一样,给publishSpy设置返回值,适配SNS调用.promise()的写法:

publishSpy.mockReturnValue({ 
    promise: () => Promise.resolve({ MessageId: 'mock-sns-message-id' }) 
});

如果需要验证publish方法的调用参数,使用下面的断言即可:

expect(publishSpy).toHaveBeenCalledWith({
    // 你期望的publish参数
    Message: 'xxx',
    TopicArn: 'xxx'
})

提示:如果你的lambda代码中是单独引入AWS SDK并初始化SNS实例,只要测试和lambda使用的是同一版本的aws-sdk依赖,该mock就会自动生效,不需要额外修改lambda代码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 04:15:00