如何在Play / Scala中对控制器进行单元测试

时间:2016-08-30 11:43:45

标签: scala unit-testing playframework

我在尝试测试向API发送POST请求的控制器时遇到了麻烦。我已经尝试了不同的测试方法,但我继续得到相同的“400”响应。我相信json val的格式是正确的,因为我已经使用Swagger测试它并且它工作正常。任何人都可以帮助我理解我在这里缺少的东西。非常感谢。

val json: JsValue = Json.parse("""[{"id":"1","address":"my address"}]""")
val mockAddressFinder = mock(classOf[AddressFinder])

"Example test" should {
  "should be valid" in {
   val controller = new Match(mockAddressFinder)
   val results = controller.match.apply(FakeRequest(
    POST,
      "test/test",
      FakeHeaders(Seq("Content-type"->("application/json"))),
    json
   ))
   results.onComplete {
    case Success(_) => results.map(s => println("hello" + s.header.status))
    case _=> println("did not work")
  }
}

2 个答案:

答案 0 :(得分:3)

你可以试试这个。这对我有用。

   val fakeRequest = FakeRequest(POST, "/someUrl", FakeHeaders(), AnyContentAsJson(Json.parse("""[{"id":"1","address":"my address"}]""")))
   val futureResult: Future[Result] = route(application, fakeRequest).get
   val resultJson: JsValue = contentAsJson(futureResult)(Timeout(2, TimeUnit.SECONDS))
   resultJson.toString mustBe """{"status":"success"}"""

答案 1 :(得分:0)

匹配控制器中的方法吗?

我认为你应该这样做

controller.match()(FakeRequest....)

controller.match()应该返回Action,这是从请求到结果的函数。对于此功能,您应该传递您的虚假请求。