Я работаю над простым веб-сайтом, используя Spring Boot и Spring MVC, и столкнулся со сценарием, для которого мне не удалось написать тест.Как вы проверяете, как контроллер работает с Errors
, которые влияют на пользовательский интерфейс, но не включены в ModelAndView
?
У меня были проблемы с отображением сообщений об ошибках в моей форме HTML, и послея обнаружил большое разочарование, потому что я перезаписывал объект Form, а затем возвращал его как объект в ModelAndView
.
Это код вопроса
@PostMapping
ModelAndView processPost(@Valid IdAndAmountForm idAndAmountForm, Errors errors) {
if (errors.hasErrors()) {
var beer = service.findBeerById(idAndAmountForm.getId());
return new ModelAndView("beerView")
.addObject("beer", beer)
.addObject("idAndAmountForm", idAndAmountForm);
} else {
cart.add(idAndAmountForm);
return new ModelAndView("redirect:/cart");
}
}
Он работает / ведет себя как ожидалось, заполняя span
соответствующим сообщением при удалении проверки HTML.
<form th:action="@{/beer}" th:object="${idAndAmountForm}" method="post">
<label>
Amount
<span th:errors="*{amount}"></span>
<input th:field="*{amount}" type="number" min="1" required>
</label>
Моя ошибка была в строке 7 контроллера, где у меня ранее было .addObject("idAndAmountForm", new IdAndAmountForm());
Не было ошибок, связанных с новой формой, поэтому сообщения об ошибках не отображались.Или это то, что, я думаю, произошло.
Теперь, как я мог написать тест, который обнаружил бы это ошибочное поведение?Я потратил некоторое время на анализ Model
, отыскивая сообщения об ошибках, которые, как я знал, каким-то образом передавались в шаблон Thymeleaf, прежде чем прийти к выводу, что сообщения об ошибках обрабатывались Spring отдельно. Этот ответ помог мне увидеть, что это был BindingResult
или Errors
объект, который я хотел проверить в своем тесте.Однако, это не часть возвращаемого значения любого метода, который я написал.
Полагаю, я мог бы попытаться написать тест для ViewResolver
или любого другого автоматически генерируемого объекта, промежуточного между моим контроллером и моим шаблоном, или я мог бы разделить мой класс контроллера, чтобы позволить моему тестовому классу получить доступ к ошибкам.Оба кажутся плохими идеями.Текущее решение состоит в том, чтобы считать сценарий слишком большим усилием для тестирования, но я не хочу верить, что это непроверяемое в принципе .