使用 Specs2 虚假请求执行 POST

Do a POST with Specs2 Fake Request

我想使用 FakeRequest + Specs2 执行 POST 操作。

到目前为止,我已经能够编写用于发出获取请求的代码

class ItemsSpec extends PlaySpecification {
  "Items controller" should {
    "list items" in new WithApplication {
      route(FakeRequest(controllers.routes.Items.list())) match {
        case Some(response) => status(response) must equalTo (OK) contentAsJson(response) must equalTo (Json.arr())
        case None => failure
      }
    }
  }
}

我面临的一些困难是

  1. 在控制器上执行 post 时使用反向查找,而不是对操作和路径进行硬编码。

  2. 发送 json 正文作为请求的一部分

  3. 解析结果并检查返回对象的某些属性是否匹配。

我在谷歌上搜索了一下,发现了这个

https://www.playframework.com/documentation/2.4.x/ScalaTestingWithSpecs2

在最后一个例子中,它似乎在做一个POST。但是路径是硬编码的,我不明白什么是基本操作。

有没有一种简单的方法可以让我为需要 POST 的 Web 服务编写测试用例?

像这样的东西应该可以工作

val Some(result) = route(FakeRequest(POST, controllers.routes.MyClassName.myMethod().url)
  .withJsonBody(Json.obj("key" -> 1234567)
)

然后查看结果正常。例如

status(result) must equalTo(OK)

编辑 - 要阅读正文,假设其 Json,请使用此

val js = contentAsJson(result)
val fieldXyz = (js \ "fieldXyz").as[String]

如果您只是将正文作为字符串读取,请使用此

val resultString = contentAsString(result)