Я пытаюсь понять akka-Testkit "и надеюсь, что можно спросить об этом.
Я нашел несколько руководств и блогов, которые обращаются либо к атрибуту состояния, либо к атрибуту lastMsg- в нижележащем актере в TestActorRef. Однако TestActorRef из «akka-testkit_2.11»% «2.4.10» не имеет этих атрибутов. Я просмотрел пример на веб-сайте akka, и, возможно, мне что-то не хватает, но они показывают тестирование, среди прочего, эхо-актора, но не с помощью каких-либо простых реализаций акторов.
Итак, может ли кто-нибудь помочь мне понять, как протестировать воркера, который ответит тем же номером, если n% 3 == 0 (как в примере). Я бы предпочел не использовать future и шаблон запроса, если это возможно, и хотел бы протестировать ответ, который даст актер (с точки зрения этого актора, получив доступ к его состоянию или что-то подобное).
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")
}
}
}
связанные: Как проверить актор Akka, который отправляет сообщение другому актеру?
На данный момент я использую подход синхронизированного тестирования;
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))
}
}
}