【问题标题】:Akka (Scala) - testing messages with paramters iwth TestKitAkka (Scala) - 使用测试工具包测试带有参数的消息
【发布时间】:2020-11-02 23:27:18
【问题描述】:

在我的应用中,我有一个 CartActor 管理购物车,而 OrderManager 监督整个购物过程:

object CartActor {

  sealed trait Command
  case class AddItem(item: Any)        extends Command
  case class RemoveItem(item: Any)     extends Command
  case object ExpireCart               extends Command
  case object StartCheckout            extends Command
  case object ConfirmCheckoutCancelled extends Command
  case object ConfirmCheckoutClosed    extends Command
  case object GetItems                 extends Command // command made to make testing easier

  sealed trait Event
  case class CheckoutStarted(checkoutRef: ActorRef) extends Event

  def props() = Props(new CartActor())
}

object OrderManager {
  sealed trait Command
  case class AddItem(id: String)                                               extends Command
  case class RemoveItem(id: String)                                            extends Command
  case class SelectDeliveryAndPaymentMethod(delivery: String, payment: String) extends Command
  case object Buy                                                              extends Command
  case object Pay                                                              extends Command
  case class ConfirmCheckoutStarted(checkoutRef: ActorRef)                     extends Command
  case class ConfirmPaymentStarted(paymentRef: ActorRef)                       extends Command
  case object ConfirmPaymentReceived                                           extends Command

  sealed trait Ack
  case object Done extends Ack //trivial ACK
}

OrderManager 从 CartActor 接收 OrderManager.ConfirmCheckoutStarted(checkoutRef: ActorRef)。我必须编写单元测试来检查。我想做:

  it should "start checkout" in {
    val cart = TestActorRef[CartActor]

    cart ! AddItem("Item")
    cart ! StartCheckout
    expectMsg(OrderManager.ConfirmCheckoutStarted)
  }

但我收到一个错误:assertion failed: expected ConfirmCheckoutStarted, found ConfirmCheckoutStarted(Actor[akka://CartTest/user/$$d/checkout#-1922766677])。我看到问题在于括号中有一个参数。我该如何测试呢?我不关心里面的actorRef,我只想要ConfirmCheckoutStarted。

【问题讨论】:

  • 将checkoutRef: ActorRef 包裹在Option 中并检查ConfirmCheckoutStarted(Some(_))
  • @Felipe 这是大学作业,我不能更改它。我只需要为这些类编写测试。

标签: scala akka


【解决方案1】:

我不知道发回的消息是哪个巡演演员。所以我创建了这个CartActor 发送消息OrderManager.ConfirmCheckoutStarted(self)。

  class CartActor extends Actor {

    import CartActor._

    override def receive: PartialFunction[Any, Unit] = {
      case AddItem(item) => sender ! s"item $item added."
      case StartCheckout => sender ! OrderManager.ConfirmCheckoutStarted(self)
      case msg => println(s"I cannot understand ${msg.toString}")
    }
  }

然后我正在执行这个检查演员参考的测试:

import akka.actor.ActorSystem
import akka.testkit.{ImplicitSender, TestActorRef, TestKit}
import org.scalatest.BeforeAndAfterAll
import org.scalatest.matchers.should.Matchers
import org.scalatest.wordspec.AnyWordSpecLike

class CartActorDemoSpec extends TestKit(ActorSystem("CartActorDemoSpec"))
  with ImplicitSender
  with AnyWordSpecLike
  with Matchers
  with BeforeAndAfterAll {

  override def afterAll(): Unit = {
    TestKit.shutdownActorSystem(system)
  }

  import CartActorDemo._

  "The ActorsIntro actor" should {
    "send back hi replay" in {
      import CartActorDemo.CartActor._
      val cart = TestActorRef[CartActor]

      val item = "MyItem"
      cart ! AddItem(item)
      expectMsg(s"item $item added.")
      cart ! StartCheckout
      expectMsg(OrderManager.ConfirmCheckoutStarted(cart))
    }
  }
}

如果您在case StartCheckout 上发回其他类型的消息,您可以相应地进行更改。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-23
    • 1970-01-01
    • 2013-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-10
    • 1970-01-01
    相关资源
    最近更新 更多