微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

AkkaScala-使用TestKit中的参数测试消息

如何解决AkkaScala-使用TestKit中的参数测试消息

在我的应用中,我有一个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

解决方法

我不知道导游演员在发回什么消息。因此,我创建了这个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上发回了另一种消息,则可以相应地进行更改。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。