ScalaPlay> 2.6, как получить доступ к запросам POST при фальсификации тривиального сервера в тестах - PullRequest
1 голос
/ 22 апреля 2019

Я пытаюсь настроить поддельный сервер с Play2.7 и средой, предложенной https://developer.lightbend.com/guides/play-rest-api/, просто повторяя json из запроса POST.Несмотря на то, что я мог делать запросы GET и POST, возвращающие зашитые значения, я не могу получить прямой доступ к запросу, чтобы вернуть или обработать его.ПРИМЕЧАНИЕ: это было выполнимо с версиями <2.6, но теперь Action устарела, поэтому мне интересно, как правильно решить эту проблему в Play> = 2.6

Я прочитал следующие howимитировать внешние вызовы WS API в Scala Play framework и Как выполнить модульное тестирование серверов в Play 2.6 теперь, когда синглтон Action устарел , которые фактически выполняют почти все, что я пытаюсь сделать, но, похоже, янужно что-то другое для доступа к запросу.В предыдущей версии Play я мог сделать что-то вроде следующего:

case POST(p"/route") => Action { request => Ok(request.body.asJson.getOrElse(JsObject.empty)) }

Но кажется, что вызывать действие таким образом невозможно, так как я получил «позорный»

object Action in package mvc is deprecated: Inject an ActionBuilder (e.g. DefaultActionBuilder) or extend BaseController/AbstractController/InjectedController

ошибка.

мой действующий рабочий код

object FakeServer {

  def withServerForStep1[T](codeBlock: WSClient => T): T =
    Server.withRouterFromComponents() { cs =>
      {
        case POST(p"/route") =>
          cs.defaultActionBuilder {
            Results.Ok(Json.arr(Json.obj("full_name" -> "octocat/Hello-World")))
          }
      }
    } { implicit port =>
      WsTestClient.withClient(codeBlock)
    }
}

, а единица измерения спецификации выглядит примерно так:

"The step 1" should {
    "Just call the fakeservice" in {
      setupContext()
      FakeServer.withServerForStep1 ( {
        ws =>
          val request = ws.url("/route")
          val data = Json.obj(
            "key1" -> "value1",
            "key2" -> "value2"
          )
          val response = request.post(data).futureValue

          response.status mustBe 200
          response.body mustBe Json.toJson(data)

      })
    }
  }

Я хотел бы написать FakeServer таким образом, чтобыСпецификация успешно проверит, что возвращаемое тело равно оригинальному отправленному json.В настоящее время он явно терпит неудачу с

"[{"full_name":"octocat/Hello-World"}]" was not equal to {"key1":"value1","key2":"value2"}

1 Ответ

1 голос
/ 01 мая 2019

В конце концов я нашел, как это сделать, и правильный путь, как это часто бывает в Scala, ... тривиален.

«Трюк» заключался в добавлении request => в тело cs.defaultActionBuilder, как в следующем примере

 object FakeServer {

  def withServerForStep1[T](codeBlock: WSClient => T): T =
    Server.withRouterFromComponents() { cs =>
      {
        case POST(p"/route") =>

          cs.defaultActionBuilder { request =>
            val bodyAsJson = request.body.asJson.getOrElse(JsObject.empty)
            Results.Ok(bodyAsJson)
          }
      }
    } { implicit port =>
      WsTestClient.withClient(codeBlock)
    }
}

Тогда тесту просто нужно разобраться с возможными дополнительными кавычками и читать как

 val response = request.post(data).futureValue

        response.status mustBe 200
        response.body mustBe Json.toJson(data).toString()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...