簡體   English   中英

Twilio API mocking 在 Nestjs 中使用 Jest 進行單元測試

[英]Twilio API mocking unit testing in Nestjs using Jest

我有這個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 的嵌套函數(驗證>服務>驗證>創建)。 此外,在 mocking 之后,我如何在 spec.ts 文件中調用或使用它。

Twilio 開發人員布道師在這里。

Mocking 嵌套對象和 function 調用比困難更煩人。 我認為這樣的事情應該適合你:

(在您的示例中,我不確定controllertwilioService之間的關系。我已嘗試在此處模擬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",
  });
});

讓我知道這是否有幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM