如何使用sinon.js/loopback testlab mock twilio-node的messages.create()返回值
解决方案
问题根因
你使用的createStubInstance仅会为Twilio类原型上的顶层方法自动生成stub,messages是Twilio实例下的嵌套对象属性,create属于这个嵌套对象的方法,不会被自动stub,因此直接调用twilioMock.stubs.messages.create会报错。
修复方案
手动构造messages对象的stub,挂载到mock的Twilio实例上即可,修改后的测试代码如下:
import { createStubInstance, StubbedInstanceWithSinonAccessor, } from '@loopback/testlab'; import sinon from 'sinon'; import {Twilio} from '../../../../clients/whatsapp-sms-clients/twilio.whatsapp-sms-clients'; import twilio from 'twilio'; // 注意如果LoggingService没导入要补对应路径的导入 import {LoggingService} from '你的logging服务对应路径'; describe('Twilio client (UnitTest)', () => { let twilioMock: StubbedInstanceWithSinonAccessor<twilio.Twilio>; let logger: StubbedInstanceWithSinonAccessor<LoggingService>; let twilioClient: Twilio; // 把createStub提出来方便各个用例访问验证 let twilioMessageCreateStub: sinon.SinonStub; beforeEach(() => { twilioMock = createStubInstance(twilio.Twilio); logger = createStubInstance(LoggingService); // 提前构造messages对象的create方法stub twilioMessageCreateStub = sinon.stub(); twilioMock.messages = { create: twilioMessageCreateStub } as any; twilioClient = new Twilio(twilioMock, logger); }); it('should create the message', async () => { // 给当前用例设置create方法的返回值 twilioMessageCreateStub.resolves({ sid: 'mock_sid_123', status: 'queued', body: '测试消息', // 补充你需要的其他返回字段 }); // 执行你要测试的业务逻辑,示例: const sendResult = await twilioClient.sendSms('+8613000000000', '测试内容'); // 验证方法调用符合预期 sinon.assert.calledOnce(twilioMessageCreateStub); sinon.assert.calledWithMatch(twilioMessageCreateStub, { to: '+8613000000000', body: '测试内容' }); }); });
关键说明
- 挂载
messages对象时加as any是为了避免Typescript类型报错,如果需要严格类型校验,可以匹配twilio库的Messages接口定义补全其他属性即可。 - 把
createStub提到全局作用域后,所有测试用例都可以复用这个stub,按需设置不同的返回值或者异常抛出逻辑,同时方便做调用校验。
内容的提问来源于stack exchange,提问作者Jeevanantham
相关产品推荐
相关产品推荐

