У меня проблемы при попытке "издеваться" над актером за маршрутом.Я хочу иметь возможность переопределять и моделировать функциональность во время тестирования, и я думаю, что TestProbe является правильным способом решения этой проблемы.
Однако я не получил TestProbe для получения одного запроса.При использовании probe.expectMsg(request)
проверка завершается неудачно с assertion failed: timeout (3 seconds) during expectMsg while waiting for GetCardRequest(12345)
.Удаление вызовов expectMsg
и reply
все равно приведет к сбою теста из-за Request was rejected
в блоке check
.Я ожидаю, что val result = request ~> routes ~> runRoute
попадет в базовый TestProbe.
Мне кажется, я просто не понимаю что-то простое в настройке!Заранее спасибо за помощь!
class MyRoutesSpec
extends WordSpec
with Matchers
with ScalaFutures
with ScalatestRouteTest
with MyRoutes {
lazy val routes = MyRoutes
val probe = new TestProbe(system)
override val cardLookupActor = probe.ref
//TODO figure out how to get TestProbe to actually work!!
"My Routes" should {
"be able to get a card from a request" in {
val cardRequest = GetCardRequest("12345")
val cardRequestEntity = Marshal(cardRequest).to[MessageEntity].futureValue // futureValue is from ScalaFutures
val request = Post("/getcard").withEntity(cardRequestEntity)
val cardResponse = ClientCard("Hello", "World")
val result = request ~> routes ~> runRoute
probe.expectMsg(cardRequest)
probe.reply(cardResponse)
check {
status should ===(StatusCodes.Created)
contentType should ===(ContentTypes.`application/json`)
entityAs[String] should ===("""{"cardName":"Hello", "cardType":"World"}""")
} (result)
}
}
}
trait MyRoutes extends JsonSupport {
// we leave these abstract, since they will be provided by the App
implicit def system: ActorSystem
lazy val log = Logging(system, classOf[MyRoutes])
// other dependencies that Routes use
def cardLookupActor: ActorRef
// Required by the `ask` (?) method below
implicit lazy val timeout = Timeout(5.seconds)
lazy val myRoutes: Route =
pathPrefix("getcard") {
concat(
path(Segment) { id =>
concat(
get {
val cardFuture: Future[ClientCard] =
(cardLookupActor ? GetCardRequest(id = id)).mapTo[ClientCard]
})
})
}
}