MockMvc 和 Geb
在上一节中,我们了解了如何将 MockMvc 与 WebDriver 结合使用。在本节中,我们 使用 Geb 让我们的测试更加 Groovy。
为什么选择 Geb 和 MockMvc?
Geb 基于 WebDriver,因此它提供了我们从 WebDriver 获得的许多 相同好处。然而,Geb 通过为我们处理一些 样板代码,使事情变得更加容易。
MockMvc 和 Geb 设置
我们可以轻松地初始化一个 Geb Browser
,它带有一个使用 MockMvc 的 Selenium WebDriver,
如下所示:
def setup() {
browser.driver = MockMvcHtmlUnitDriverBuilder
.webAppContextSetup(context)
.build()
}
这是使用 |
这确保了任何将 localhost
作为服务器的 URL 都被定向到我们的
MockMvc
实例,而无需真实的 HTTP 连接。任何其他 URL
都通过网络连接正常请求。这使我们能够轻松测试
CDN 的使用。
MockMvc 和 Geb 用法
现在我们可以像往常一样使用 Geb,而无需将我们的应用程序部署到 Servlet 容器。例如,我们可以用以下方式请求视图来创建消息:
to CreateMessagePage
然后我们可以填写表单并提交它以创建消息,如下所示:
when:
form.summary = expectedSummary
form.text = expectedMessage
submit.click(ViewMessagePage)
任何无法识别的方法调用或属性访问或引用都将转发到当前的页面对象。 这消除了我们直接使用 WebDriver 时所需的许多样板代码。
与直接使用 WebDriver 一样,这通过使用页面对象模式改进了我们
HtmlUnit 测试 的设计。
如前所述,我们可以将页面对象模式与 HtmlUnit 和
WebDriver 结合使用,但使用 Geb 会更容易。考虑我们新的基于 Groovy 的
CreateMessagePage
实现:
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,
可以在其中找到此页面。这使我们能够导航到该页面,如下所示:
to CreateMessagePage
我们还有一个 at
闭包,用于确定我们是否在指定页面。如果我们在
正确的页面上,它应该返回 true
。这就是为什么我们可以断言我们在
正确的页面上,如下所示:
then:
at CreateMessagePage
errors.contains('This field is required.')
我们在闭包中使用断言,以便我们可以在 我们处于错误页面时确定问题出在哪里。 |
接下来,我们创建一个 content
闭包,它指定页面中所有感兴趣的区域。
我们可以使用
类似于 jQuery 的 Navigator
API 来选择我们感兴趣的内容。
最后,我们可以验证是否已成功创建新消息,如下所示:
then:
at ViewMessagePage
success == 'Successfully created a new message'
id
date
summary == expectedSummary
message == expectedMessage
有关如何充分利用 Geb 的更多详细信息,请参阅 The Book of Geb 用户手册。