给了一个简单的Play 2.6.24控制器来处理查询参数,即
class MyController @Inject()(val controllerComponents: ControllerComponents) extends BaseController {
def foo(name: Option[String]= None) = { ... }
}
我应该如何使用ScalaTest在不实例化foo
的情况下测试FakeApplication
正常工作并获取正确的查询参数?
我随附的最接近的是:
class MyControllerSpec extends FlatSpec with StubControllerComponentsFactory with Results with Matchers {
private val controller = new MyController(stubControllerComponents())
it should "read `name` query parameter" in {
val result = controller.foo().apply(FakeRequest("GET", "/?name=test"))
contentAsString(result) shouldBe ...
}
}
但是,正如您所知,这将行不通:FakeRequest
内容将被忽略,我必须显式地将控制器称为controller.foo(Some("test")).apply(...)
,这看起来并不好,也不合逻辑(为什么我仍然必须提供一个不会被使用的FakeRequest?)。
[我有一种感觉,因为它是在路由级别完成的,所以我将不得不使用FakeApplication ...但是也许我错了,而且有人知道一种实现我所寻找的方法的方法。
谢谢!
据我所知,除非调用需要实际应用程序的路由器,否则无法测试FakeRequest中提供的查询参数。>
正如您所解释的,controller.foo(Some("test")).apply(...)
将起作用,因为查询参数已提取到方法参数中,但实际上并没有为您的测试增加太多价值。
通过实例化应用程序并通过路由器进行测试,您可以验证客户端将能够以应有的支持方式调用您的方法,包括路径,请求方法,标头等。这也使它变得更简单如果您更新了控制器呈现结果的方式,则可以检测到不兼容的更改。