Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/grails/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Grails功能测试Geb页面对象模块不工作没有方法签名_Grails_Groovy_Spock_Functional Testing_Geb - Fatal编程技术网

Grails功能测试Geb页面对象模块不工作没有方法签名

Grails功能测试Geb页面对象模块不工作没有方法签名,grails,groovy,spock,functional-testing,geb,Grails,Groovy,Spock,Functional Testing,Geb,这是页面对象 package myapp.pages import geb.Page class LoginPage extends Page { static url = "http://localhost:8080/login/auth" //static at = {title.contains("Login")} static at = { waitFor {title.contains("Login")} // Add waitFor here

这是页面对象

package myapp.pages
import geb.Page

class LoginPage extends Page {
    static url = "http://localhost:8080/login/auth"
    //static at = {title.contains("Login")}
    static at = {
        waitFor {title.contains("Login")} // Add waitFor here to verify on page
    }
    static content = {
        loginForm { $( 'form') }
        usernameField { $('form').userName }
        passwordField { $('form').password }
        submitButton { $('input#submit' )}
    }

    void  loginSubmit(String email, String password) {
        usernameField = "email@something.com"
        assert $('form').username == "email@something.com"
        passwordField = "secret"
        assert $('form').password == "secret"
        submitButton.click()
    }
}
这是LoginSpec测试文件

package myapp.login

import geb.spock.GebSpec
import grails.testing.mixin.integration.Integration
import grails.transaction.*
import myapp.pages.LoginPage

@Integration
@Rollback
class LoginSpec extends GebSpec {

    def setup() {
    }

    def cleanup() {
    }

    void "user successfully logs in, is redirected to homepage"() {
        given:
        to LoginPage

        when:
        LoginPage.loginSubmit("email@something.com", "secret")

        then:
        title.contains("Dashboard")
    }
}
运行此测试时,出现以下错误:

groovy.lang.MissingMethodException: No signature of method: static myapp.pages.LoginPage.loginSubmit() is applicable for argument types: (java.lang.String, java.lang.String) values: [email@something.com.com, secret]

当我将用户名和密码硬编码到登录页面loginsubmit函数中时,基本上会遇到相同的错误。选择器很好,当我在LoginSpec测试中直接使用相同的选择器设置用户名和密码时,测试通过。此问题仅在我尝试使用page对象时发生。

Geb记住当前页面并自动向该页面发送方法调用,因此您不需要包含页面类名:
loginSubmit(“email@something.com“,“秘密”)测试中的
将调用页面上的方法。

Geb记住当前页面并自动向页面发送方法调用,因此您不需要包括页面类名:
loginSubmit('email@something.com“,“secret”)
将调用页面上的方法。

而不是此方法:

package myapp.pages
import geb.Page

class LoginPage extends Page {
    static url = "http://localhost:8080/login/auth"
    //static at = {title.contains("Login")}
    static at = {
        waitFor {title.contains("Login")} // Add waitFor here to verify on page
    }
    static content = {
        loginForm { $( 'form') }
        usernameField { $('form').userName }
        passwordField { $('form').password }
        submitButton { $('input#submit' )}
    }

    void  loginSubmit(String email, String password) {
        usernameField = "email@something.com"
        assert $('form').username == "email@something.com"
        passwordField = "secret"
        assert $('form').password == "secret"
        submitButton.click()
    }
}
    when:
    LoginPage.loginSubmit("email@something.com", "secret")
使用以下命令:

    when:
    loginSubmit("email@something.com", "secret")
这不是一个真正的Geb问题。JVM不允许在类引用上调用实例方法,因为执行该调用所需的上下文不存在
loginSubmit
是一种实例方法,而不是静态方法

我希望这会有所帮助。

而不是:

    when:
    LoginPage.loginSubmit("email@something.com", "secret")
使用以下命令:

    when:
    loginSubmit("email@something.com", "secret")
这不是一个真正的Geb问题。JVM不允许在类引用上调用实例方法,因为执行该调用所需的上下文不存在
loginSubmit
是一种实例方法,而不是静态方法


我希望这能有所帮助。

但这并不能解释OP所犯的错误以及相应的错误信息。真正的问题是通过
LoginPage.loginSubmit(..)
调用实例方法
loginSubmit
,就好像它是静态的一样。相反,他应该像您一样调用它,在规范中隐式地或通过
def loginPage=to loginPage显式地设置页面;loginPage.loginSubmit(..)
。一个好的答案应该解释问题的根本原因,而不仅仅是提供一个没有解释的解决方案。这也解决了问题,知道Geb记住了当前页面非常有用,谢谢!但这并不能解释OP所犯的错误以及相应的错误信息。真正的问题是通过
LoginPage.loginSubmit(..)
调用实例方法
loginSubmit
,就好像它是静态的一样。相反,他应该像您一样调用它,在规范中隐式地或通过
def loginPage=to loginPage显式地设置页面;loginPage.loginSubmit(..)
。一个好的答案应该解释问题的根本原因,而不仅仅是提供一个没有解释的解决方案。这也解决了问题,知道Geb记住了当前页面非常有用,谢谢!这就解决了问题,谢谢,还有额外的内容!如果您想保持IDE自动完成支持,我建议在给定块中使用
LoginPage LoginPage=to LoginPage
,然后在when块中使用
LoginPage.loginSubmit(“email@something.com“,”机密“
。就像kriegaex在另一个答案中所建议的那样。@LeonardBrüings有一个问题,那就是
中的
to
当:
块之后通常是
at
然后:块。将
to
返回值分配给静态类型的引用将是
to
导致重定向的问题。您也可以将
的结果分配给
。这解决了问题,谢谢,并提供了额外的上下文!如果您想保持IDE自动完成支持,我建议在给定块中使用
LoginPage LoginPage=to LoginPage
,然后在when块中使用
LoginPage.loginSubmit(“email@something.com“,”机密“
。就像kriegaex在另一个答案中所建议的那样。@LeonardBrüings有一个问题,那就是
中的
to
当:
块之后通常是
at
然后:块。将
to
返回值分配给静态类型的引用将是
to
导致重定向的问题。您也可以在
处分配
的结果。