如何解决使用 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 开发者布道者。
模拟嵌套对象和函数调用比困难更烦人。我认为这样的事情应该对你有用:
(我不确定您示例中的 controller
和 twilioService
之间的关系。我试图在这里模拟 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",});
});
如果这有帮助,请告诉我。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。