Извлечь значение из 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
}

person pik4    schedule 17.07.2018    source источник
comment
Не могли бы вы заключить ожидаемый ответ в \/-(EitherT(Future(Success(\/-(...)?   -  person daniel kullmann    schedule 17.07.2018
comment
Нет, это не вариант.   -  person pik4    schedule 17.07.2018
comment
Можете ли вы предоставить свои операторы импорта и определения классов? У меня возникли проблемы с выяснением, какая библиотека, например. AsyncEither происходит от.   -  person Astrid    schedule 17.07.2018
comment
@ Астрид, кажется, тебе не нужен val a = ..., потому что он нигде не используется.   -  person daniel kullmann    schedule 18.07.2018
comment
@Astrid Я только что добавил ответ с моей реализацией.   -  person pik4    schedule 18.07.2018


Ответы (1)


Наконец, это правильный подход, который у меня есть.

"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
    )
}
person pik4    schedule 18.07.2018
comment
К вашему сведению, я бы не рекомендовал использовать Await.result, потому что он блокирует поток. У Scalatest есть несколько вариантов работы с Future, которые можно запускать параллельно — я рассматриваю их в этом ответе: stackoverflow. com/questions/51210054/ . - person Astrid; 19.07.2018