使用Sinon测试mailgun-js发送方法报wrap undefined property 'messages'错误
报错根因
- 核心逻辑错配:Sinon的
sandbox.stub(对象, '方法名')的返回值就是被替换掉的那个stub方法本身,不是原来的对象。你把这个stub函数直接赋值给了sender变量,相当于sender现在是个普通函数,函数本身没有名为messages的属性,后面执行sandbox.spy(sender, "messages")时,自然找不到要包裹的messages属性,直接抛出TypeError。 - 测试逻辑冗余错位:你已经在
beforeEach阶段把mailgun实例的messages方法做了stub,后续又在测试用例里重复对不存在的属性套spy,属于完全错位的打桩逻辑。
修复步骤
- 调整stub的对象引用关系
正确的操作是先初始化mailgun实例,把实例本身存为sender变量,再对实例身上的messages方法做stub替换,而不是把stub方法的返回值赋值给sender:beforeEach(() => { // 初始化得到真实的mailgun实例 sender = mailgun.default({ apiKey: 'foo', domain: 'bar' }); // 对实例的messages方法做stub,调用时返回带send stub的对象 sandbox.stub(sender, 'messages').returns({ send: mailgunSendSpy }); }); - 删除冗余的无效spy调用
你的测试目标是验证服务正确调用了mailgun的send方法,不需要额外对messages方法套一层spy,直接通过之前定义的mailgunSendSpy做断言即可。同时要注意把mock的sender实例正确注入到EmailgunService的依赖里,否则服务内部如果直接初始化mailgun实例,你在测试文件外层做的stub根本不会生效。 - 针对依赖版本的适配说明
你当前使用的mailgun-js 0.22.0版本中,messages是挂在初始化实例上的实例方法,不存在嵌套的属性层级,之前写的sandbox.spy(sender, "messages")完全不符合这个版本的对象结构。
内容的提问来源于stack exchange,提问作者user1916077
相关产品推荐
相关产品推荐

