MockMvc和Geb
在前一节中,我们看到了如何在WebDriver中使用MockMvc。在本节中,我们使用Geb来使我们的测试更加Groovy。
为什么选择Geb和MockMvc?
Geb由WebDriver支持,因此它提供了许多我们从WebDriver中获得的相同的优势。然而,Geb通过为我们处理一些样板代码使事情变得更加简单。
MockMvc和Geb设置
我们可以轻松地使用Selenium WebDriver初始化一个使用MockMvc的Geb Browser
,如下所示:
def setup() {
browser.driver = MockMvcHtmlUnitDriverBuilder
.webAppContextSetup(context)
.build()
}
这是使用MockMvcHtmlUnitDriverBuilder 的一个简单示例。有关更高级用法,请参见高级MockMvcHtmlUnitDriverBuilder 。 |
这确保了任何引用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的导航器API来选择我们感兴趣的内容。
最后,我们可以验证成功创建了一条新消息,如下所示:
then:
at ViewMessagePage
success == '成功创建了一条新消息'
id
date
summary == expectedSummary
message == expectedMessage
有关如何充分利用Geb的更多详细信息,请参阅Geb之书用户手册。