2

我正在尝试了解 akka-Testkit”,并希望可以询问它。

我找到了一些教程和博客,它们可以访问 TestActorRef 上的基础Actor 的 state- 或 lastMsg- 属性。但是,来自 "akka-testkit_2.11" % "2.4.10" 的 TestActorRef 没有这些属性。我查看了 akka 网站上的示例,也许我遗漏了一些东西,但是它们显示了对回声演员的测试,但没有使用任何简单的演员实现。

那么,如果 n % 3 == 0 (在示例中就是这种情况),有人可以帮助我了解如何测试一个将以相同数字响应的工人。如果可能的话,我宁愿不使用未来和询问模式,并希望对参与者将给出的响应进行测试(从参与者的角度来看,通过访问其状态或类似的东西)。

class ProjectEulerScalaTestAkka extends TestKit(ActorSystem("testing")) with WordSpecLike with MustMatchers {

    "A simple actor" must {
        val actorRef = TestActorRef[Worker]
        "receive messages" in {
             actorRef ! 3
             actorRef.underlyingActor.state//must not equal("world")
        }
    }
}

相关: 如何测试向另一个actor发送消息的Akkaactor?

现在我正在使用同步测试方法;

 import akka.actor.ActorSystem
 import akka.testkit.{TestActorRef, TestKit}
 import org.scalatest.Matchers
 import org.scalatest.WordSpecLike
 import akka.pattern.ask
 import scala.concurrent.Future
 import scala.concurrent.duration._
 import scala.util.Success

class ProjectEulerScalaTestAkka extends TestKit(ActorSystem("testing")) with WordSpecLike with Matchers {
      implicit val time = akka.util.Timeout(100 seconds)
      "A simple actor" must {
           val actorRef = TestActorRef[Worker]
           "receive messages" in {
               val f = (actorRef ? 3).asInstanceOf[Future[Int]]
               val reply = f.value.get
               reply should equal (Success(3))
           }
      }
}
4

1 回答 1

0

我所做的是模拟我向其发送消息的 Actor 的接口,捕获消息并将成功消息发送回 testActor 引用。

具有捕获的消息有效负载的成功对象

case class SuccessWith(capturedMessage:Any = null)

您向其发送消息的模拟actor,反过来,它会向测试actor返回一些值

case class MockActor(requester: ActorRef) extends Actor {
  override def receive: Receive = {
    case i: Int => {
      requester ! i
    }
  }
}

设置你想要单元测试的演员

val actorRef = system.actorOf(Props(new YourActor(args)))

然后你的测试

  "A simple actor" must {
       "receive messages" in {
           val f = actorRef ! 3
           expectMsg(Success(3))
       }
  }
}
于 2018-03-13T16:36:57.960 回答