首页 > 解决方案 > 使用 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 文件中调用或使用它之后。

标签: typescriptunit-testingjestjstwiliotwilio-api

解决方案


Twilio 开发人员布道者在这里。

模拟嵌套对象和函数调用比困难更烦人。我认为这样的事情应该适合你:

(我不确定您的示例中的 thecontroller和 the之间的关系twilioService。我试图在这里模拟 the twilioClienttwilioService但您可能需要根据事物的组合方式对其进行调整。)

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",
  });
});

让我知道这是否有帮助。


推荐阅读