使用查询参数测试播放控制器

问题描述 投票:0回答:1

给了一个简单的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 ...但是也许我错了,而且有人知道一种实现我所寻找的方法的方法。

谢谢!

scala testing playframework
1个回答
1
投票

据我所知,除非调用需要实际应用程序的路由器,否则无法测试FakeRequest中提供的查询参数。>

正如您所解释的,controller.foo(Some("test")).apply(...)将起作用,因为查询参数已提取到方法参数中,但实际上并没有为您的测试增加太多价值。

通过实例化应用程序并通过路由器进行测试,您可以验证客户端将能够以应有的支持方式调用您的方法,包括路径,请求方法,标头等。这也使它变得更简单如果您更新了控制器呈现结果的方式,则可以检测到不兼容的更改。

© www.soinside.com 2019 - 2024. All rights reserved.