如何使用 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");
});
});
以上测试在我的设置中通过了。
我正在尝试从 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");
});
});
以上测试在我的设置中通过了。