玩2.4 Scaldi WS测试

时间:2016-01-14 15:05:41

标签: scala testing dependency-injection playframework-2.0 scaldi

我想在这里使用Play 2.4文档中解释的假服务器来测试WS客户端:https://www.playframework.com/documentation/2.4.x/ScalaTestingWebServiceClients

但是我正在和Scaldi一起做DI,并且我无法使用Play的文档代码来使用Scaldi。

有人可以帮助我吗?

适应的代码主要是这个(来自Play文档):

"GitHubClient" should {
  "get all repositories" in {

    Server.withRouter() {
      case GET(p"/repositories") => Action {
        Results.Ok(Json.arr(Json.obj("full_name" -> "octocat/Hello-World")))
      }
    } { implicit port =>
      WsTestClient.withClient { client =>
        val result = Await.result(
          new GitHubClient(client, "").repositories(), 10.seconds)
        result must_== Seq("octocat/Hello-World")
      }
    }
  }
}

2 个答案:

答案 0 :(得分:3)

可以在此处找到集成测试的一般方法示例:

https://github.com/scaldi/scaldi-play-example/blob/master/test/IntegrationSpec.scala#L22

它不是直接等效的,因为它使用HttpUnit代替WSClient。更精确的等价物将是这样的:

import scaldi.play.ScaldiApplicationBuilder._
import scaldi.Injectable._

val fakeRotes = FakeRouterModule {
  case ("GET", "/repositories") => Action {
    Results.Ok(Json.arr(Json.obj("full_name" -> "octocat/Hello-World")))
  }
}

withScaldiInj(modules = fakeRotes :: Nil) { implicit inj ⇒
  val client = inject [WSClient]

  withTestServer(inject [Application]) { port ⇒
    val result = Await.result(
      new GitHubClient(client, s"http://localhost:$port").repositories(), 10.seconds)

    result must_== Seq("octocat/Hello-World")
  }
}

它使用WSClient,就像你的例子一样。不同之处在于注入了ApplicationWSClient,并且测试不依赖于全局州或工厂。

为了使用这个例子,你还需要这个小帮助函数,它根据注入的Application创建一个测试服务器:

def withTestServer[T](application: Application, config: ServerConfig = ServerConfig(port = Some(0), mode = Mode.Test))(block: Port => T)(implicit provider: ServerProvider): T = {
  val server = provider.createServer(config, application)

  try {
    block(new Port((server.httpPort orElse server.httpsPort).get))
  } finally {
    server.stop()
  }
}

Play已经提供了一些开箱即用的辅助函数来创建一个测试服务器,但是大多数都重新初始化了依赖Guice的应用程序。这是因为您需要创建自己的简化版本。这个功能可能是包含在scaldi-play中的一个很好的候选者。

答案 1 :(得分:2)

Jules,

迟到的反应,但我自己也经历了这个。以下是我使用wsUrl测试ScalaTest(Play Spec),测试服务器和WSTestClient的方法。这是为了发挥2.5.4。该项目位于:reactive-rest-mongo

class UsersSpec extends PlaySpec with Injectable with OneServerPerSuite {

  implicit override lazy val app = new ScaldiApplicationBuilder()
    .build()

  "User APIs" must {

    "not find a user that has not been created" in {
      val response = Await.result(wsUrl("/users/1").get, Duration.Inf)
      response.status mustBe NOT_FOUND
      response.header(CONTENT_TYPE) mustBe None
      response.bodyAsBytes.length mustBe 0
    }
  }
}