【问题标题】:Testing Play controller with query parameter使用查询参数测试 Play 控制器
【发布时间】:2019-12-02 10:48:26
【问题描述】:

给定一个处理查询参数的简单 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】:

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

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

    实例化应用程序并使用路由器进行测试允许您验证客户端是否能够以应支持的方式调用您的方法,其中包括路径、请求方法、标头等。这也使得它如果您更新了控制器呈现结果的方式,则更容易检测到不兼容的更改。

    【讨论】:

    • 确实,最后我使用了GuiceOneAppPerSuite 并路由了整个虚假请求;感谢您的确认
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-19
    • 1970-01-01
    • 2016-02-21
    • 2016-11-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多