4

Play2.1-RC1を使用して簡単なテストを書くことはできません。

アクションコードは次のとおりです。

def echoTestTagFromXml = Action(parse.xml) { request =>
    (request.body \ "test" headOption).map(_.text).map { test =>
        Ok(views.xml.testTag(test))
    }.getOrElse {
      BadRequest("Missing parameter [name]")
    }
}

テストコードは次のとおりです。

"Test Tag Xml Echo" in {
    running(FakeApplication()) {
      val req = new FakeRequest(POST, controllers.routes.SimpleResultsController.echoTestTagFromXml().url, FakeHeaders(), Xml("<test>gg</test>"))        
      val result = controllers.SimpleResultsController.echoTestTagFromXml()(req)
      status(result) must equalTo(OK)
    }
}

テストでエラーが発生します:

[error]  found   : play.api.libs.iteratee.Iteratee[Array[Byte],play.api.mvc.Result]
[error]  required: play.api.mvc.Result

グーグルから私は問題がBodyParserにあることを知っています。しかし、(APIの調査後)コードを機能させる方法がわかりません。

4

1 に答える 1

7

次の変更されたテストコードは機能するはずですが、ボディをFakeRequestに渡そうとすると、現時点でバグがあると思います。機能テストでの二日酔いは、現在非推奨の「routeAndCall」関数です。体は常に空です。

"Test Tag Xml Echo" in {
  running(FakeApplication()) {
    val req = FakeRequest(POST, controllers.routes.SimpleResultsController.echoTestTagFromXml().url, FakeHeaders(), Xml("<test>gg</test>"))
      .withHeaders(CONTENT_TYPE -> "text/xml")
    val result = await(controllers.SimpleResultsController.echoTestTagFromXml()(req).run)
    contentAsString(result) must equalTo("gg")
    status(result) must equalTo(OK)
  }
}

Jsonをボディに渡すことについても同様の問題がありますが、これをボディパーサーで機能させようとしました(違いに注意してください)。また、content-typeヘッダーを設定してください。

ただし、代わりに「route」関数を使用できます。

"Test Tag Xml Echo Route" in {
  running(FakeApplication()) {
    val result = route(FakeRequest(POST, "/SimpleResultsController").withHeaders(CONTENT_TYPE -> "text/xml"), Xml("<test>gg</test>")).get
    contentAsString(result) must equalTo("gg")
    status(result) must equalTo(OK)
  }
}

これは私にとってはうまくいくようで、このソリューションをコピーして貼り付けることができるはずです。

ルートを文字列として繰り返したくない場合は、以前と同じように逆ルートを使用できます。controllers.routes.SimpleResultsController.echoTestTagFromXml().url

于 2012-12-11T23:15:51.710 に答える