Ответ теста Spray.io не соответствует фактическому выводу

Я пытаюсь настроить некоторые тесты для API, созданного коллегой с spray.io, и у меня возникает странное поведение. Когда запрос по какой-либо причине приводит к ошибке, мы хотим вернуть значение JSON в следующем виде:

{"status":false,"message":"useful message here"}

Это происходит очень хорошо в реальном браузере. Я перешел на необработанный маршрут в веб-браузере и получил желаемое значение JSON. Итак, я хочу проверить это. Теперь, так как я новичок в spray.io, я начал с очень простого теста:

"leave GET requests to root path unhandled" in {
  Get() ~> myRoute ~> check {
    handled must beFalse
  }
}

Все прошло нормально, никаких проблем. Так как я впервые играю с spray.io, я посмотрел некоторые примеры тестов для тестирования ложных маршрутов и обернулся myRoute с sealRoute() чтобы я мог проверить ответ, не провалив тесты:

"leave GET requests to root path unhandled" in {
  Get() ~> sealRoute(myRoute) ~> check {
    handled must beTrue
  }
}

Это тоже отлично работает. Итак, я решил просто убедиться, что текст ответа пригоден для этого, прежде чем приступить к анализу JSON и проверке отдельных значений:

"leave GET requests to root path unhandled" in {
  Get() ~> sealRoute(myRoute) ~> check {
    responseAs[String] contains "false"
  }
}

Это терпит неудачу. Чтобы исследовать, я набросал простую строку кода для регистрации фактического значения responseAs[String] в файл, и я получил это:

The requested resource could not be found.

Может кто-нибудь сказать мне, что я делаю не так? Я думаю, что происходит одно из следующего:

  • responseAs[String] делает больше, чем просто получает точный ответ и возвращает его мне, применяя какой-то тип фильтра по пути
  • Сама структура не полностью оценивает запрос, а скорее создает объект-макет для тестовой среды, и поэтому не выполняет желаемые методы "превратить ошибки в json", которые реализовал мой коллега.

Я пытался выполнить поиск в Google и переполнение стека специально для подобных проблем, но я либо не вписываю правильные запросы, либо большинство других пользователей обращаются к сообщениям об ошибках по умолчанию и не пытаются проверить их, кроме проверки handled must beFalse,

Изменить - это соответствующая часть RejectionHandler:

case MissingQueryParamRejection(paramName) :: _=>
  respondWithMediaType(`application/json`) {
    complete(BadRequest, toJson(Map("status" -> false, "message" -> s"Missing parameter $paramName, request denied")))
  }

1 ответ

Итак, с пониманием и коллегой, проблема была найдена:

В основном, обычай RejectionHandler был определен в рамках нашего обычая Actor объект, и это не входило в область применения в тестах. Чтобы решить эту проблему, были предприняты следующие шаги:

  • Перемещено определение для кастома RejectionHandler в свой собственный объект в отдельном файле (так как он должен был делать свой собственный импорт, он вызывал ошибку "обнаружен импорт без восстановления цикла")
  • Импортировал этот новый объект как в исходный файл, так и в тестовую спецификацию.

(забавный факт - http://spray.io/documentation/1.2.2/spray-routing/key-concepts/rejections/, кажется, демонстрирует RejectionHandler как объект верхнего уровня, но вы не можете иметь неявные значения верхнего уровня в Scala, отсюда и необходимость в объекте)

Другие вопросы по тегам