В моем приложении Scala говорят, что у меня есть Актер A
и Актер B
. Я хочу разработать тестовый пример в ScalaTest, который позволит мне отправить сообщение Актеру A
и посмотреть, какое сообщение он отправляет Актеру B
, чтобы узнать, правильно ли обрабатывает его A
и отправляет правильное сообщение B
. Как бы это проверить? Мне потребовалось много времени, чтобы приготовить это самостоятельно ... но это, похоже, в основном работает.Скала и Акка - Тестирующие актеры как система с Аккой Testkit
class A extends Actor { ... }
class B extends Actor { ... }
class C(p: TestProbe) extends B {
override def receive = {
LoggingReceive {
case x =>
println(x.toString)
p.ref ! x
}
}
}
case class MsgToB(...)
// Spec class which extends TestKit
"A" should {
"send the right message to B" {
val p = TestProbe()
val a = TestActorRef[A]
val c = TestActorRef(Props(new C(p)))
// Assume A has a reference to C. Not shown here.
a ! msg
// Assert messages
p.expectMsgType[MsgToB]
}
}
Это лучшее средство для этого? Есть ли более эффективная практика?
Мне это нравится. Я пошел с оригинальной реализацией, потому что мне нужно было что-то сделать, но это звучит интересно. Цель состоит в том, чтобы протестировать всю актерскую систему от нашего актера входа, который обрабатывает веб-запросы на всю цепочку (обманутых) вызовов службы, которые мы выполняем, и проверяем вывод данных, а также веб-ответ. Одна из проблем заключалась в получении асинхронного поведения, чтобы утверждения не нужно было заказывать. Если это работает, это решает. – Rig