首页 > 解决方案 > 从 AsyncEither 中提取值 - ScalaZ

问题描述

我是 ScalaZ 和 Scala 的新手,所以我遇到了以下问题。我为我的应用程序编写了一些单元测试,我需要的是提取实际响应的值。

你能对我怎么做有任何提示吗?

Expected :PaymentResponse(7bc2dc3b-c347-422f-b204-ccefb22708fa,
                          7bc2dc3b-c347-422f-b204-ccefb22708fa,USD,15.9,PAYMENT_PENDING,Paypal,VISA,None)
Actual   :\/-(EitherT(Future(Success(\/-(PaymentResponse(7bc2dc3b-c347-422f-b204-ccefb22708fa,
               7bc2dc3b-c347-422f-b204-ccefb22708fa,
               USD,15.9,PAYMENT_PENDING,Paypal,VISA,None))))))

整个测试:

"should return a payment object" in {
  val paymentId = UUID.randomUUID()
  val a: AsyncEither[FinanceGatewayError, PaymentResponse] = paymentService.getPayment(ProfileId("profileId"), paymentId.toString)

  val expectedPaymentResponse = PaymentResponse(
    paymentId = paymentId.toString,
    orderId = paymentId.toString,
    currency = "USD",
    amount = 15.90,
    status = PAYMENT_PENDING,
    paymentMethodLabel = "Paypal",
    paymentMethodIssuer = VISA,
    threeDSecure = None
  )
  \/-(paymentService.getPayment(ProfileId("profileId"), paymentId.toString)) shouldBe expectedPaymentResponse
}

标签: scalaasynchronousfuturescalazconcurrent.futures

解决方案


最后,这是我拥有的正确方法。

"should return a payment object" in {
  val paymentId = UUID.randomUUID()
  val expectedPaymentResponse = PaymentResponse(
    paymentId = paymentId.toString,
    orderId = paymentId.toString,
    currency = "USD",
    amount = 15.90,
    status = PAYMENT_PENDING,
    paymentMethodLabel = "Paypal",
    paymentMethodIssuer = VISA,
    threeDSecure = None
  )
  val paymentResponse: AsyncEither[FinanceGatewayError, PaymentResponse] =
    paymentService.getPayment(ProfileId("profileId"), paymentId.toString)
  Await
    .result(paymentResponse.run, 5 seconds)
    .fold(
      error => fail(s"The test is failed because $error ."),
      payment => payment shouldBe expectedPaymentResponse
    )
}

推荐阅读