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
导致重定向的问题。您也可以在处分配的结果。