scala - meaning - Coincidencia de patrones en el mensaje esperado
akka vs kafka (1)
¿Cómo puedo probar el mensaje esperado con akka testkit si no conozco todos los detalles del mensaje? ¿Puedo usar el subrayado de alguna manera "_"?
Ejemplo que puedo probar:
echoActor ! "hello world"
expectMsg("hello world")
Ejemplo que quiero probar
case class EchoWithRandom(msg: String, random: Int)
echoWithRandomActor ! "hi again"
expectMsg(EchoWithRandom("hi again", _))
La forma en que no quiero usar:
echoWithRandomActor ! "hi again"
val msg = receiveOne(1.second)
msg match {
case EchoWithRandom("hi again", _) => //ok
case _ => fail("something wrong")
}
No parece que puedas hacer mucho al respecto, porque expectMsg
usa ==
detrás de escena .
Podría intentar usar expectMsgPF
, donde PF proviene de PartialFunction
:
echoWithRandomActor ! "hi again"
expectMsgPF() {
case EchoWithRandom("hi again", _) => ()
}
Actualizar
En las versiones recientes ( 2.5.x
en este momento) necesitas un TestProbe
.
También puede devolver un objeto desde el expectMsgPF
. Podría ser el objeto contra el que está haciendo coincidir el patrón o partes de él. De esta manera, puede inspeccionarlo aún más después de que expectMsgPF
devuelva correctamente.
import akka.testkit.TestProbe
val probe = TestProbe()
echoWithRandomActor ! "hi again"
val expectedMessage = testProbe.expectMsgPF() {
// pattern matching only
case ok@EchoWithRandom("hi again", _) => ok
// assertion and pattern matching at the same time
case ok@EchoWithRandom("also acceptable", r) if r > 0 => ok
}
// more assertions and inspections on expectedMessage
Ver Akka Testing para más información.