[英]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(...)
會起作用,因為查詢參數被提取到方法參數中,但它實際上並沒有為您的測試增加太多價值。
實例化應用程序並使用路由器進行測試可以讓您驗證客戶端是否能夠以應該支持的方式調用您的方法,包括路徑、請求方法、標頭等。這也使得檢測更簡單如果您曾經更新控制器呈現結果的方式,則不兼容的更改。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.