typescript - 使用 Jest 在 Nestjs 中进行 Twilio API 模拟单元测试
问题描述
我有这个twilio.service.ts
文件。我想为twilio.service.spec.ts
验证 OTP 已成功发送或因缺少参数而失败的两种情况编写单元测试。
twilio.services.ts:
async startVerification(
startVerificationDto: StartVerificationDto
) {
try {
const verificationResponse = await this.twilioClient.verify
.services("TWILIO_VERIFY_SERVICE_SID")
.verifications.create({
to: `+91${sendVerificationCodeDto.phoneNumber}`,
channel: "sms",
locale: "en",
});
return verificationResponse;
} catch (error) {
throw new BadRequestException("Failed sending OTP");
}
}
到目前为止它尝试过:
it("Should be able to send verification code on mobile number", async () => {
const actualRes = await controller.startVerification({
phoneNumber: "xxxxxxxxxxx",
});
expect(twilioService.twilioClient.verify.services).toBeCalledWith(
"TWILIO_VERIFY_SERVICE_SID"
);
expect(actualRes).toEqual({
sid: "VA_TWILIO_VERIFY_SERVICE_SID",
});
});
it("Should return error if required parameters are missing", async () => {
expect(twilioService.twilioClient.verify.services).not.toBeCalledWith(
"TWILIO_VERIFY_SERVICE_SID"
);
try {
await controller.startVerification({
phoneNumber: "xxxxxxxxxxx",
});
} catch (e) {
expect(e.message).toBe("Failed sending OTP");
}
});
我主要关心的是:如何模拟 Twilio 的嵌套函数(验证>服务>验证>创建)。此外,在嘲笑我如何在 spec.ts 文件中调用或使用它之后。
解决方案
Twilio 开发人员布道者在这里。
模拟嵌套对象和函数调用比困难更烦人。我认为这样的事情应该适合你:
(我不确定您的示例中的 thecontroller
和 the之间的关系twilioService
。我试图在这里模拟 the twilioClient
,twilioService
但您可能需要根据事物的组合方式对其进行调整。)
it("Should be able to send verification code on mobile number", async () => {
const mockVerificationCreate = jest.fn().mockResolvedValue({
sid: "VA_TWILIO_VERIFY_SERVICE_SID"
})
const mockVerifyService = jest.fn().mockReturnValue({
verifications: {
create: mockVerificationCreate
}
})
twilioService.twilioClient = {
verify: {
services: mockVerifyService
}
}
const actualRes = await controller.startVerification({
phoneNumber: "xxxxxxxxxxx",
});
expect(twilioService.twilioClient.verify.services).toBeHaveBeenCalledWith(
"TWILIO_VERIFY_SERVICE_SID"
);
expect(mockVerificationCreate).toHaveBeenCalledWith({
to: "+91xxxxxxxxxxx",
channel: "sms",
locale: "en",
});
expect(actualRes).toEqual({
sid: "VA_TWILIO_VERIFY_SERVICE_SID",
});
});
让我知道这是否有帮助。
推荐阅读
- blockchain - 将使用哪个标准?ERC721 还是 ERC1155?
- visual-studio-code - 我的 vs 代码 UI 发生了什么,它放大了很多
- sql - 根据属性值从 XML 中提取不同的值
- android - 基于意图的 Android 安全漏洞,违反设备和网络滥用政策
- python-3.x - Odoo讨论频道在odoo erp 13中添加新用户时创建
- dart - 将字节转换为 dart 中的位,反之亦然
- mysql - mySQL 根据日期和其他列计算重复条目
- azure-devops-migration-tools - 将工作项从 TFS 2018 迁移到 Azure DevOps 2020 无法迁移工作项之间的链接
- symfony - 使用自定义独白通道升级 Symfony 3 项目
- networking - Wildfly 网络中断场景