2017-08-02 15 views
0

我一直在努力奮鬥幾個小時,每次發送一個FakeRequest時,似乎FakeApplication都會收到一個空的主體。但是,如果我嘗試運行Play應用程序並向本地主機發送正常請求,則所有事情都按預期工作,我收到作爲響應發送的文本。Playframework測試。 FakeRequest始終以空身發送(scala)

enter image description here

測試的另一種測試,我已經完成正在發送來自控制器的自定義響應(不一樣的接收),就像一個字符串「a」。

我的測試代碼如下所示:

 val controller = app.injector.instanceOf(classOf[CreateRecordController]) 
    val js = Json.obj() 
    val result = controller.apply().apply(
    FakeRequest(POST, "/api/v1/record/") 
     .withHeaders(Headers(CONTENT_TYPE -> "application/json")) 
     .withJsonBody(js) 
) 

    val content = contentAsJson(result) 

    info.apply(s"content was $content") 

最後一條語句打印: 「內容是」 和一個HTML頁面,指出:「對於請求 'POST/API/V1 /記錄/'[無效JSON:無由於輸入結束 at [Source:[email protected]; line:1,column:0]]「 - >所以內容是空的。在控制器

我的操作處理程序是:

def apply: Action[JsValue] = Action.async(parse.json) { implicit request => 

      Future.successful(BadRequest(request.body).withHeaders("Content-type" -> "application/json")) 

    } 

我缺少的東西?

遊戲版本:2.6.2

+0

你可能有一個BodyParser在你的控制器,期待一個JSON和空體從技術上講是無效的JSON,因此是錯誤響應。你可以從Controller中粘貼你的Action處理程序嗎? – saheb

+0

@saheb控制器張貼。正如我在問題中解釋的那樣,使用POST向相應的uri發送請求的方式如預期的那樣 – vicaba

+0

現在在編輯之後。您在響應中發送內容類型爲application/json,並且正文('request.body.toString')不是有效的JSON。因此錯誤。 – saheb

回答

0

看來,如果內容傳遞給FakeRequest在構造時它按預期工作。我所看到的是,如果我在構造時將JsValue作爲主體傳遞,那麼FakeRequest的類型爲FakeRequest [JsValue],它工作正常。但是,如果使用.withBodyAsJson方法,則類型將變爲FakeRequest [AnyContentAsJson]。這可能是一個錯誤。

1

在這裏你去,給這個第一讀 - https://www.playframework.com/documentation/2.6.x/ScalaEssentialAction

控制器

def work = Action.async(parse.json) { implicit request => 
    Future.successful(BadRequest(request.body).withHeaders((CONTENT_TYPE, "application/json"))) 
    } 

測試

class ApplicationSpec extends PlaySpec with Results with GuiceOneAppPerTest with Injecting { 
    "Application" should { 
     "work" in { 
      implicit lazy val materializer: Materializer = app.materializer 
      val controller = new Application(inject[ControllerComponents]) 
      val body = Json.obj() 
      val result = call(controller.work(), FakeRequest(POST, "/work").withHeaders((CONTENT_TYPE, "application/json")).withJsonBody(body)) 
      contentAsJson(result) mustBe body 
     } 
     } 
    }