【发布时间】:2014-06-11 20:20:22
【问题描述】:
我正在使用 Thymeleaf 和 Spring MVC 开发 Spring Boot 应用程序,我在代码中遇到了一个错误,有人将 Spring MVC 模型绑定到 2 个不同的 HTML 表单字段:
<input th:field="*{userModel.name}" type="text" />
<input id="name" th:field="*{userModel.name}" type="hidden" />
这导致控制器模型中的名称字段设置为逗号分隔值的字符串。例如“史蒂夫,史蒂夫”。我解决了这个问题,但我想知道为此编写回归测试的最简单方法。有一个 Spring MVC 测试框架,我可以使用as on this blog post,但我真正想测试的是渲染模板和控制器之间的交互,而不仅仅是控制器。
我可以使用硒测试,但我最近阅读了this Martin Fowler bliki/article(blikticle?),其中他说:
一个特别常见的问题是团队将端到端测试、UI 测试和面向客户的测试的概念混为一谈。这些都是正交特征。
我认为这是一个很好的观点。我想写的是一个 UI 组件(集成?)测试。比加载整个页面更小的东西。仅测试表单生成和提交的东西。
我的另一个想法是,这种错误可能最好通过静态分析工具来捕获,但这有点超出了我的范围。
在这个项目中,我意识到 Spring MVC 和 HTML 表单之间的交互是错误的常见位置,所以如果有一种方法可以测试这些交互,那就太好了。
编辑:
经过进一步考虑,我认为这些是我想要的测试步骤:
- 从模板的 thymeleaf 模板中选择
<form>标签并渲染它,在模型上传递适当的数据 - 可能以编程方式编辑呈现的表单值(来自 Java)以模拟 JavaScript 交互。
- 根据呈现的表单生成浏览器的 http POST 请求。
- 使用 Spring 将 POST 请求转换为控制器的模型参数的任何方法
- 要么调用控制器并验证结果,要么只是断言模型已正确创建
我认为我可以使用 Thymeleaf 的片段选择器或通过将我的表单重构为单独的模板来做到 #1。 #2 我可以使用 JSoup 轻松完成。这是#3和#4,我不知道该怎么做。 #3 我也许可以自己写,这取决于 HttpServletRequest 模拟的工作方式。 #4 似乎它必须在 Spring 的某个地方可用,但我是 Spring 的新手。
更新:
将WebDataBinder 视为#4 的可能解决方案。
【问题讨论】:
标签: java spring-mvc testing thymeleaf