使用Specs2伪造请求进行POST

时间:2015-07-15 02:43:35

标签: scala playframework specs2

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

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

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. 在控制器上发帖时使用反向查找,而不是硬编码操作和路径。

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

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

  4. 我做了一些谷歌搜索,发现了这个

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

    在最后一个例子中,它似乎正在进行POST。但路径是硬编码的,我不明白什么是必要的行动。

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

1 个答案:

答案 0 :(得分:4)

这样的事情应该有效

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)