1

我正在尝试使用 Grails 编写一个简单的 Geb/Spock 测试,但我收到以下测试失败。

| Failure:  login works correctly(...UserAuthAcceptanceSpec)
|  Condition not satisfied:

at HomePage
|
null

我可以使用浏览器通过调试器跟踪测试,并且可以看到应用程序按预期工作并且显示了正确的标题。但是,当我尝试调用at检查器时,测试失败了。谁能告诉我为什么测试中的最终断言可能会失败以及为什么“at”检查器似乎为空?

这是我的代码:(Geb v0.9.0,Grails 2.2.2)

斯波克规格:

class UserAuthAcceptanceSpec extends GebReportingSpec {

    def "login works correctly"() {

        given: "the correct credentials"
            def theCorrectUsername = "admin"
            def theCorrectPassword = "password"

        when: "logging in"
            to LoginPage
            username = theCorrectUsername
            password = theCorrectPassword 
            submitButton.click() //([HomePage, LoginPage])

        then: "the welcome page is shown"
            heading =~ /(?i)Welcome.*/   // <- same as 'at' checker in HomePage
        and: "the 'at' checker works"
            at HomePage                  // <- fails

    }

登录页面

class LoginPage extends Page {

    final String path = "/login/auth"

    static content = {
        heading(required: false, wait:true) { $("h1").text() }
        username     { $("input", name:"j_username") }
        password     { $("input", name:"j_password") }
        submitButton { $("input", id:"submit") }
    }

    static at = {
        title =~ /Login.*/
    }

}

主页

class HomePage extends Page {

    final String path   = "/"

    static content = {
        heading(required: false, wait:true) { $("h1").text() }
    }

    static at = {
        heading =~ /(?i)Welcome.*/
    }

}
4

1 回答 1

2

检查器at应该使用==~而不是=~.

Geb 的隐含断言意味着以下陈述:

heading1 =~ /(?i)Welcome.*/
heading2 ==~ /(?i)Welcome.*/

有效地变成:

assert (heading1 =~ /(?i)Welcome.*/) == true     // [1]      
assert (heading2 ==~ /(?i)Welcome.*/) == true    // [2] 

[2] 将评估为布尔值并按预期​​通过/失败,而 [1] 评估为java.util.regex.Matcher导致失败的 a。

有关两种语法之间差异的说明, 请参阅Groovy Regex FAQ 。

于 2013-07-09T19:29:12.953 回答