测试 Play Enumeratee

Testing Play Enumeratee

我正在使用 Play Enumeratee/Enumerator 发送浏览器事件。我的事件是 case 类,它将被序列化为 JSON。我有类似这样的代码:

import play.api.libs.iteratee.{Enumeratee, Enumerator, Iteratee}
import scala.concurrent.duration._
import scala.concurrent.{Await, ExecutionContext, Future}
implicit val ex = ExecutionContext.global


case class SomeClass(a: String, b: String, c: List[String])

val someEnumerator: Enumerator[SomeClass] = Enumerator.apply(
  SomeClass("a", "b", List("a", "b", "c")),
  SomeClass("s", "a", Nil),
  SomeClass("g", "g", Nil),
  SomeClass("a", "T", List("a", "1", "c")))

val filtering: Enumeratee[SomeClass, SomeClass] = Enumeratee.filter[SomeClass](sc => sc.c.nonEmpty)

val toJson: Enumeratee[SomeClass, String] =
  Enumeratee.map[SomeClass] {
    sc =>
      import org.json4s._
      import org.json4s.native.Serialization
      implicit val formats = Serialization.formats(NoTypeHints)
      Serialization.write(sc)
  }

val jsonStream: Enumerator[String] = someEnumerator &> filtering &> toJson

如何获得结果并测试 filteringtoJsonjsonStream

一个想法是 运行 Enumerator 通过 Iteratee 来收集结果,然后对结果应该是什么做出断言。您可以使用 Iteratee.getChunksEnumerator[SomeClass] 送入 List[SomeClass].

// test filtering
val filterResult: Future[List[SomeClass]] = someEnumerator &> filtering |>>> Iteratee.getChunks

// Using the specs2 dsl just to illustrate my point.
// This won't compile as-is, as `filterResult` is a `Future`, so we need to use
// await to unwrap the `Future` and make our assertions. In specs2 I think
// you can use filterResult.await..., but I'm not 100% sure.
// You can also use Await.result(filterResult, Duration.Inf)
filterResult.forall(_.c.nonEmpty) must beTrue

// test json
val jsonResult: Future[List[String]] = someEnumerator &> toJson |>>> Iteratee.getChunks

// Use some assertion to match the JSON structure you get back.