我想用假服务器测试WS客户端,如Play 2.4文档中的解释: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")
}
}
}
}
最佳答案
可以在此处找到集成测试的一般方法的示例:
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
。区别在于,已注入Application
和WSClient
,并且测试不依赖于全局状态或工厂。为了使用此示例,您还需要这个小的辅助函数,该函数根据注入的
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中的很好的候选者。
关于scala - 进行2.4 Scaldi WS测试,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34792807/