使用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
相关产品推荐
相关产品推荐

