如何使用 sinon js/loopback testlab 从 twilio-node 模拟 messages.create() 方法的 return 值?

How to mock the return value of messages.create() method from twilio-node using sinon js/loopback testlab?

我正在尝试从 twilio-node[=26= 模拟 messages.create() 方法的 return 值]图书馆。

由于创建方法驻留在名为 messages 的接口中,我无法直接模拟创建方法的 return 值。

我的单元测试:

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';

describe('Twilio client (UnitTest)', () => {
  let twilioMock: StubbedInstanceWithSinonAccessor<twilio.Twilio>;
  let logger: StubbedInstanceWithSinonAccessor<LoggingService>;
  let twilioClient: Twilio;

  beforeEach(() => {
    twilioMock = createStubInstance(twilio.Twilio);
    logger = createStubInstance(LoggingService);
    twilioClient = new Twilio(twilioMock, logger);
  });

  it('should create the message', async () => {
    twilioMock.stubs.messages.create.resolves({
      // mocked value
    });
  });
});

提前致谢。

此处为 Twilio 开发人员布道师。

我以前没有像这样使用过 testlab/sinon,但我想我知道你需要做什么,如果语法不正确的话。

您需要将对 twilioMock.messages 的响应存根到 return 一个具有 create 属性 的对象,该对象是解析为结果的存根函数你要。这样的事情可能会奏效,或者至少让你走上正轨:

  it('should create the message', async () => {
    // Create stub for response to create method:
    const createStub = sinon.stub().resolves({
      // mocked value
    });
    // Stub the value "messages" to return an object that has a create property with the above stub:
    twilioMock.stubs.messages.value({ 
      create: createStub
    });

    // Rest of the test script
  });

编辑

好的,使用上面的 value 无效。我又试了一次。此版本从示例中删除了您的自定义 Twilio 包装器,并直接在 Twilio 客户端存根本身上调用内容。希望您可以以此为灵感,将其应用到您的测试中。

我意识到 twilioClient.messages is a getter 并且是动态定义的。所以,我直接在存根客户端上存根了结果。

import {
  createStubInstance,
  StubbedInstanceWithSinonAccessor,
} from "@loopback/testlab";
import sinon from "sinon";
import { Twilio } from "twilio";

describe("Twilio client (UnitTest)", () => {
  let twilioMock: StubbedInstanceWithSinonAccessor<Twilio>;

  beforeEach(() => {
    twilioMock = createStubInstance(Twilio);
  });

  it("should create the message", async () => {
    const createStub = sinon.stub().resolves({
      sid: "SM1234567",
    });
    sinon.stub(twilioMock, "messages").get(() => ({
      create: createStub,
    }));
    const message = await twilioMock.messages.create({
      to: "blah",
      from: "blah",
      body: "hello",
    });
    expect(message.sid).toEqual("SM1234567");
  });
});

以上测试在我的设置中通过了。