Проверка источника akka-потока в модульном тестировании

#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 .