簡體   English   中英

Play Framework和Scala:FakeRequest和JSON POST在單元測試中存在問題

[英]Play Framework & Scala: Problems with FakeRequest & JSON POST in unit test

我花了太多時間嘗試調試以下問題,但是我不確定問題發生在哪里。

問題:得到400 Bad Request, Invalid Json作為響應,但有以下異常:

com.fasterxml.jackson.databind.JsonMappingException: No content to map due to end-of-input
 at [Source: [B@6ee503c9; line: 1, column: 1]
    at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:164) ~[jackson-databind.jar:2.2.2]
    at com.fasterxml.jackson.databind.ObjectMapper._initForReading(ObjectMapper.java:2931) ~[jackson-databind.jar:2.2.2]
    at com.fasterxml.jackson.databind.ObjectMapper._readValue(ObjectMapper.java:2846) ~[jackson-databind.jar:2.2.2]
    at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:1569) ~[jackson-databind.jar:2.2.2]
    at play.api.libs.json.JacksonJson$.parseJsValue(JsValue.scala:480) ~[play-json_2.10.jar:2.2.0]
    at play.api.libs.json.Json$.parse(Json.scala:27) ~[play-json_2.10.jar:2.2.0]

在我的控制器中要測試的方法:

  def createArticle(id: String) =
      Action.async(parse.json) { implicit request =>
        (request.body \ "content").asOpt[String].map {
            ............
            ............
        }.getOrElse(BadRequest("Invalid request body"))
      }

對應單元測試:

  "create article" in {
    running(FakeApplication()) {
      val postJson = Json.obj("content" -> "article content")

      val result = resource.createArticle(ARTICE_ID)(FakeRequest(POST, controllers.routes.ArticleResource.create(ARTICLE_ID).url).withJsonBody(postJson).withHeaders(CONTENT_TYPE -> "application/json").run

      status(result) must equalTo OK
    }
  }

我在這里閱讀了討論但是那里的建議都沒有幫助。

我也遇到過類似的問題,但到目前為止還沒有解決(非常好,無論如何)。 由於我的環境是java而不是scala,所以我可以預感。 我認為,當您發送帖子時,它是異步完成的(在create article方法中為Action.async),因此您可能需要等待測試代碼結果后才能查看它是否正常。

我有一個類似的問題,解決方案在這里指出。 就我而言,這是因為我兩次使用response.asJson() ,如@jroper所述

考慮到HTTP響應的主體是流,而不是您要在內存中緩沖的東西,因此,不支持兩次訪問主體(無論您以何種格式訪問主體)都是有意義的。

嘗試在方法定義內實例化您的請求。

這就是我的工作方式(例如,將POST與JSON正文一起使用,結果作為JSON):

"process" should {
    "should be valid" in {
 val request = FakeRequest(POST, "/").withJsonBody(Json.parse("""      {  
     "id":1,
     "name":"prod 1",
     "price":55.55
  }"""))

  val result: Future[Result] = controller.process.apply(request)      
  val json = contentAsJson(result)            

  status(result) must be(CREATED)
  (json \ "id").as[Int] mustBe 1

// .. more assertions and rest of code ...

這里的代碼處理一個JsValue並查詢其節點以檢查返回的值是否與所需的模擬數據輸出匹配

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM