You need to enable JavaScript to run this app. 使用Sinon测试mailgun-js发送方法报wrap undefined property 'messages'错误
优惠活动
大模型
产品
解决方案
定价
更多

使用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,属于完全错位的打桩逻辑。
修复步骤
  1. 调整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
        });
    });
    
  2. 删除冗余的无效spy调用
    你的测试目标是验证服务正确调用了mailgun的send方法,不需要额外对messages方法套一层spy,直接通过之前定义的mailgunSendSpy做断言即可。同时要注意把mock的sender实例正确注入到EmailgunService的依赖里,否则服务内部如果直接初始化mailgun实例,你在测试文件外层做的stub根本不会生效。
  3. 针对依赖版本的适配说明
    你当前使用的mailgun-js 0.22.0版本中,messages是挂在初始化实例上的实例方法,不存在嵌套的属性层级,之前写的sandbox.spy(sender, "messages")完全不符合这个版本的对象结构。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.09 20:45:02