MockMvc 和 Geb

在上一节中,我们了解了如何将 MockMvc 与 WebDriver 结合使用。在本节中,我们将 使用 Geb 使我们的测试更加 Groovy-er。spring-doc.cadn.net.cn

为什么选择 Geb 和 MockMvc?

Geb 由 WebDriver 提供支持,因此它提供了许多与我们相同的好处 WebDriver 的然而,Geb 通过处理一些 样板代码。spring-doc.cadn.net.cn

MockMvc 和 Geb 设置

我们可以轻松初始化 GebBrowser使用使用 MockMvc 的 Selenium WebDriver 作为 遵循:spring-doc.cadn.net.cn

def setup() {
	browser.driver = MockMvcHtmlUnitDriverBuilder
		.webAppContextSetup(context)
		.build()
}
这是一个使用MockMvcHtmlUnitDriverBuilder.对于更高级的 用法,请参阅高深MockMvcHtmlUnitDriverBuilder.

这可确保任何 URL 引用localhost因为服务器被定向到我们的MockMvc实例,而无需真正的 HTTP 连接。任何其他 URL 为 通过正常使用网络连接请求。这让我们可以轻松地测试 CDN 的spring-doc.cadn.net.cn

MockMvc 和 Geb 使用情况

现在我们可以像往常一样使用 Geb,但不需要将我们的应用程序部署到 一个 Servlet 容器。例如,我们可以请求视图创建一条消息,其中包含 以后:spring-doc.cadn.net.cn

to CreateMessagePage

然后,我们可以填写表单并提交它以创建消息,如下所示:spring-doc.cadn.net.cn

when:
form.summary = expectedSummary
form.text = expectedMessage
submit.click(ViewMessagePage)

任何无法识别的方法调用或未找到的属性访问或引用都是 forwarded to the current page 对象。这删除了很多 直接使用 WebDriver 时需要。spring-doc.cadn.net.cn

与直接使用 WebDriver 一样,这通过使用 Page 对象改进了 HtmlUnit 测试的设计 模式。如前所述,我们可以将 Page Object Pattern 与 HtmlUnit 和 WebDriver 的,但使用 Geb 就更容易了。考虑我们新的基于 Groovy 的CreateMessagePage实现:spring-doc.cadn.net.cn

class CreateMessagePage extends Page {
	static url = 'messages/form'
	static at = { assert title == 'Messages : Create'; true }
	static content =  {
		submit { $('input[type=submit]') }
		form { $('form') }
		errors(required:false) { $('label.error, .alert-error')?.text() }
	}
}

我们CreateMessagePage延伸Page.我们不讨论Page,但是,在 总结,它包含我们所有页面的通用功能。我们定义了一个 URL,其中 这个页面可以找到。这样,我们就可以导航到该页面,如下所示:spring-doc.cadn.net.cn

to CreateMessagePage

我们还有一个atclosure 来确定我们是否在指定的页面。它应该 返回true如果我们在正确的页面上。这就是为什么我们可以断言我们在 正确的页面,如下所示:spring-doc.cadn.net.cn

then:
at CreateMessagePage
errors.contains('This field is required.')
我们在闭包中使用 assertion,以便我们可以确定哪里出了问题 如果我们在错误的页面上。

接下来,我们创建一个contentclosed 指定 页。我们可以使用 jQuery 风格的 Navigator API 来选择我们感兴趣的内容。spring-doc.cadn.net.cn

最后,我们可以验证是否已成功创建新消息,如下所示:spring-doc.cadn.net.cn

then:
at ViewMessagePage
success == 'Successfully created a new message'
id
date
summary == expectedSummary
message == expectedMessage

有关如何充分利用 Geb 的更多详细信息,请参阅 The Book of Geb 用户手册。spring-doc.cadn.net.cn