Ответ теста 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, отсюда и необходимость в объекте)