Akka(Scala)-使用TestKit测试带参数的消息

4nkexdtk  于 2022-11-06  发布在  Scala
关注(0)|答案(1)|浏览(134)

在我的应用程序中,我有一个CartActor来管理购物车,而OrderManager则负责监督整个购物过程:
第一个
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]) .我看到问题是parantheses里面有一个参数,怎么测试呢?里面的actorRef我不管,我只要ConfirmCheckoutStarted

ncecgwcz

ncecgwcz1#

我不知道巡演演员在发回什么消息,所以我创建了这个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}")
    }
  }

然后我执行这个测试,检查actor引用:

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,你可以只是相应地改变它。

相关问题