12

new を使用しているコントローラーをテストしようとしていAction.asyncます。ドキュメントに従って、コントローラーの下の部分を除外しました。型参照で特性を分離するためにテストしたい:

trait UserController { this: Controller =>
  def index() = Action { /* snip */ }
  def register() = Action.async(parse.json) { request => /* snip */ }
}

ドキュメントには、次のようにテストすることになっていると記載されています。

object UsersControllerSpec extends PlaySpecification with Results {
  class TestController() extends Controller with UserController
    "index action" should {
      "should be valid" in {
        val controller = new TestController()
        val result: Future[SimpleResult] = controller.index().apply(FakeRequest())
        /* assertions */
      }
    }
  }
}

メソッドの場合index()は完全に機能しますが、残念ながら、register()FakeRequest を適用すると のインスタンスが返されるため、 で同じことを行うことはできませんIteratee[Array[Byte], SimpleResult]run()返すメソッドがあることに気付きましたFuture[SimpleResult]が、どのようにビルドしても、コンテンツやヘッダーなしFakeRequestで返されます。400の内容はFakeRequestまったく無視されているように思えます。リクエストの本文を iteratee に何らかの方法でフィードしてから実行することになっていますか? どうすればそれができるかの例が見つかりませんでした。

4

2 に答える 2

9

この問題は、play.api.mvc.Action[A]次の 2 つの apply メソッドが含まれているために発生します。

// What you're hoping for
def apply(request: Request[A]): Future[Result]

// What actually gets called
def apply(rh: RequestHeader): Iteratee[Array[Byte], Result]

これが発生する理由Request[A] extends RequestHeaderは、 でありA、この場合はすべての違いが生じます。正しい型でない場合は、間違った を呼び出すことになりますapply

ActionBuilderとともに使用するとBodyParser[A]、 が作成されますAction[A]Request[A]その結果、テストする必要があります。parse.jsonを返すBodyParser[JsValue]ので、 が必要ですRequest[JsValue]

// In FakeRequest object
def apply(): FakeRequest[AnyContentAsEmpty.type]

FakeRequest()必要なタイプが得られません。幸運:

// In FakeRequest class
def withBody[B](body: B): FakeRequest[B]

したがって、本文のプレースホルダーを使用してテストを書き始めます。

  "should be valid" in {
    val controller = new TestController()
    val body: JsValue = ??? // Change this once your test compiles

    // Could do these lines together, but this shows type signatures
    val request: Request[JsValue] = FakeRequest().withBody(body)
    val result: Future[Result] = controller.index().apply(request)

    /* assertions */
  }
于 2014-09-02T04:44:12.843 に答える