У меня есть метод в моем контроллере, который я хотел бы вызвать напрямую. Он принимает POST-форму, проверяет ее, а затем что-то возвращает. Я хочу проверить это напрямую, т.е. не проходить через помощник маршрутов.
Это мой код формы (FormFields - это просто класс case)
val searchForm = Form(
mapping(
"foo" -> nonEmptyText,
"filter" -> optional(text).verifying("Filter text must be 'published' or 'unpublished'",
x => x.isEmpty || x.get == "published" || x.get == "unpublished")
)(FormFields.apply)(FormFields.unapply)
)
Это мой вызов контроллера.
def doThings() = IsAuthenticated {
username => implicit request => {
searchForm.bindFromRequest().fold(
formWithErrors => BadRequest(s"Incorrect data: ${formWithErrors.errors.map(x => s"${x.key} ${x.message}").mkString}."),
form => {
OK("Test text here")
}
)
}
}
Если я вызову это через файл маршрутов, как показано ниже, это будет работать так, как ожидалось. Форма публикуется, проверяется, возвращает OK ("Тест..."), как и ожидалось.
т.е. Нижеприведенные работы (с использованием Specs2)
val request = FakeRequest(POST, "notarealurl")
.withFormUrlEncodedBody(
"filter" -> "published",
"foo" -> "Test"
).withSession("email" -> "testuser")
val Some(result) = route(request)
status(result) must equalTo(OK)
Однако все, что я пытаюсь вызвать, метод терпит неудачу - сбой происходит на этапе проверки формы. Он говорит мне, что «foo» отсутствует значение, когда я запускаю модульный тест. Вот как я пытаюсь это сделать.
val request = FakeRequest()
.withFormUrlEncodedBody(
"filter" -> "published",
"foo" -> "Test"
).withSession("email" -> "testuser")
//val Some(result) = route(request)
val result = Search.searchProducts()(request)
println(contentAsString(result))
status(result) must equalTo(OK)
Напечатанный текст: «Неверный поиск: foo error.required». Я думаю, что неправильно звоню, но я не знаю, где я ошибаюсь.
Примечание. Код здесь представляет мою проблему, но он был сокращен, чтобы просто проиллюстрировать проблему.