使用查询参数测试播放控制器
Testing Play controller with query parameter
给定一个处理查询参数的简单 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(...)
会起作用,因为查询参数被提取到方法参数中,但它实际上并没有为您的测试增加太多价值。
实例化应用程序并使用路由器进行测试可以让您验证客户端是否能够以应该支持的方式调用您的方法,包括路径、请求方法、headers、等。如果您更新控制器呈现结果的方式,这也使得检测不兼容的更改变得更简单。
给定一个处理查询参数的简单 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(...)
会起作用,因为查询参数被提取到方法参数中,但它实际上并没有为您的测试增加太多价值。
实例化应用程序并使用路由器进行测试可以让您验证客户端是否能够以应该支持的方式调用您的方法,包括路径、请求方法、headers、等。如果您更新控制器呈现结果的方式,这也使得检测不兼容的更改变得更简单。