#scala #unit-testing #akka-stream
#scala #модульное тестирование #akka-stream
Вопрос:
Каков идиоматический способ проверки источника akka-stream в модульном тестировании? Я делаю так:
f.service.fetchData(id).flatMap {
case Right(source) => {
// TODO: I need to validate here that source contains "Test value"
}
case Left(_) => fail("Wrongly responded with error")
}
источник в основном:
Source.single(ByteString("Test value"))
Я попытался выполнить, подключив источник к приемнику и проверив переданные значения, но утверждения, похоже, не работают.
Комментарии:
1. Получил работу с: source .fold(«») { case (x, y) => x y.decodeString(«UTF-8») } .RunWith(Sink.head) .await
Ответ №1:
Правильный способ тестирования источников, потоков и приемников — это использование тестовых зондов.
Учитывая следующий источник, логику witch, которую вы хотите протестировать
val source = Source(Seq("TestValue")).collect {
case s @ "TestValue" => Right[String, String](s)
case _ => Left[String, String]("error")
}
(Я знаю, что здесь это Left
никогда не сработает, но это всего лишь пример)
Теперь вы можете определить a TestSink
, который подключен к данному источнику. Результирующий график выполняется следующим образом
"assert correct value" in {
implicit val system: ActorSystem = ???
val probe = source.toMat(TestSink.probe)(Keep.right).run()
probe.request(1)
probe.expectNext(Right("TestValue"))
}
TestSink.probe
это приемник, который материализуется в a TestSubscriber.Probe[T]
и обеспечивает управление потоком. Поскольку это приемник, он должен запрашивать запрос на элемент. Он делает это через request(1)
или запрашивает один элемент. Затем следует assert sink.expectNext(Right("TestValue"))
, который проверяет, получено ли правильное значение.
Существует также вызываемый аналог TestSource.probe
, который позволяет тестировать a Sink
.
И, вычесывая их оба, вы можете протестировать Flow
.