Статьи

Весенний тест с тимьяном для взглядов

Я недавно перешел на тимилиф для шаблонов представления в веб-приложениях на основе Spring, предпочитая его jsp. Все аргументы, которые приводятся в документации по тимилефу, объясняют, почему тимелист над jsp держит воду, и я определенно продан.

Одной из главных причин для меня, помимо возможности предварительного просмотра шаблона, является способ отображения представления во время выполнения. Принимая во внимание, что стек приложения должен отложить рендеринг jsp до контейнера сервлета, он полностью контролирует рендеринг шаблонов тимилиста. Чтобы прояснить это немного, с jsp в качестве технологии представления приложение возвращает только местоположение jsp, и это до контейнера сервлета для рендеринга jsp.

Так почему же это является важной причиной — потому что с помощью поддержки теста mvc в модуле spring-test теперь можно отображать фактически отображаемый контент, а не только имя представления.

Рассмотрим пример контроллера Spring MVC:

01
02
03
04
05
06
07
08
09
10
11
@Controller
@RequestMapping("/shop")
public class ShopController {
    ...
 
 @RequestMapping("/products")
 public String listProducts(Model model) {
  model.addAttribute("products", this.productRepository.findAll());
  return "products/list";
 }
}

Если бы представление основывалось на jsp, у меня был бы тест, который выглядит следующим образом:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration(classes = SampleWebApplication.class)
public class ShopControllerWebTests {
 
 @Autowired
 private WebApplicationContext wac;
 
 private MockMvc mockMvc;
 
 @Before
 public void setup() {
  this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build();
 }
 
 @Test
 public void testListProducts() throws Exception {
  this.mockMvc.perform(get("/shop/products"))
   .andExpect(status().isOk())
   .andExpect(view().name("products/list"));
 }
}

утверждение только на имя вида.

Теперь рассмотрим тест с тимелием, используемым в качестве технологии просмотра:

1
2
3
4
5
6
@Test
public void testListProducts() throws Exception {
 this.mockMvc.perform(get("/shop/products"))
  .andExpect(status().isOk())
  .andExpect(content().string(containsString("Dummy Book1")));
}

Здесь я утверждаю на фактическом предоставленном содержании.

Это действительно хорошо, в то время как с jsp мне пришлось бы проверять, что jsp правильно отображается во время выполнения с реальным контейнером, а с помощью thymeleaf я могу проверить, что рендеринг чистый только с помощью тестов.

Ссылка: Весенний тест с тимелистом для взглядов от нашего партнера JCG Биджу Кунджуммена в блоге all and sundry.