我最近才开始为我们的网络应用程序创建Geb / Spock测试,并且 - 鉴于我对Geb,Spock以及Groovy所有东西的知识有限 - 已经碰到了一个没有任何意义的错误(给定我的Java经验。)
所以,这是有问题的模块:
import geb.Module
import geb.navigator.Navigator
class Tile extends Module {
def currencyPair
static content = {
amount {
$(".currencypair-span", text: containsWord(currencyPair))
.parent().parent()
.find(".tile-amount-setup").find("input") }
}
}
没有什么特别的。
这是页面(我不确定这一切是如何组合在一起的):
import geb.Page
class TraderApp extends Page {
static url = "./"
static at = { title == "FOOBARTrader" }
static content = {
tile { instrument -> module Tile, currencyPair: instrument }
}
}
以下是测试规范:
import geb.spock.GebSpec
import spock.lang.*
import org.openqa.selenium.Keys
class BugSpec extends SbkSpec {
final CURPAIR = "FOOBAR"
def setupSpec() {
accountSelector.dropDown.click()
accountSelector.dropDown << Keys.chord(Keys.CONTROL, "a")
accountSelector.dropDown << "FxOnly"
accountSelector.dropDown << Keys.ENTER
waitFor() { accountSelector.dropDown.value() == "FXOnly" }
tileLayout("Majors").tab.click()
}
def "test1"() {
given:
tile(CURPAIR).amount.click()
when:
println("foo")
then:
waitFor {true}
}
def "test2"() {
given:
tile(CURPAIR).amount.click()
when: println("bar")
then:
waitFor {true}
}
}
现在,问题是第一个测试将运行并通过,但是当第二个测试运行时,JVM将在tile()方法上报告NoSuchMethodException 。
这怎么可能?我很欣赏Groovy是一种动态语言,但这种方法在哪里消失?
这使得我无法在几个不同的测试中重用内容,因为一旦我退出使用它的第一个测试,有问题的内容就无法访问。
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running BugSpec
Starting ChromeDriver (v2.10.267521) on port 32075
Only local connections are allowed.
foo
Tests run: 2, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 19.425 sec <<< FAILURE!
test2(BugSpec) Time elapsed: 0.175 sec <<< ERROR!
groovy.lang.MissingMethodException: No signature of method: geb.navigator.NonEmptyNavigator.tile() is applicable for argument types: (java.lang.String) values: [FOOBAR]
Possible solutions: size(), tail(), filter(java.lang.String), find(java.lang.String), is(java.lang.String), take(int)
at geb.navigator.NonEmptyNavigator.methodMissing(NonEmptyNavigator.groovy:463)
at geb.content.NavigableSupport.methodMissing(NavigableSupport.groovy:123)
at geb.Browser.methodMissing(Browser.groovy:194)
at geb.spock.GebSpec.methodMissing(GebSpec.groovy:51)
at BugSpec.test2(BugSpec.groovy:35)
请帮忙吗?
修改
根据Erdi的回答,包括也是BugSpec的超类:
import geb.spock.GebReportingSpec
class SbkSpec extends GebReportingSpec {
def setupSpec() {
def environment = System.getProperty("geb.env");
given:
to AuthApp
expect:
at AuthApp
when:
def username = browser.getConfig().getRawConfig().get("username")
def password = browser.getConfig().getRawConfig().get("password")
login.username.value(username)
login.password.value(password)
login.loginButton.click()
then:
at TraderApp
and:
waitFor() { accountSelector.dropDown.value() == "FOOBAR-ACCOUNT" }
}
def cleanupSpec() {
given:
at TraderApp
then:
logout.logoutButton.click()
}
}
答案 0 :(得分:3)
使用内置基础GebSpec
/ GebReportingSpec
时,Geb会将缺少的方法调用调度到spec {'1}}属性的page
属性。某些东西(没有看到更多的代码而且无法确切说明它究竟是什么)在第一次测试之前将该属性设置为browser
的实例。 Geb在每个测试之间重新创建TraderApp
实例,这意味着页面实例被重置为默认值,即browser
的实例。如果您将网页设置为Page
的实例,则会找到TraderApp
方法:
tile()
如果您为def "test2"() {
given:
page TraderApp
tile(CURPAIR).amount.click()
when: println("bar")
then:
waitFor {true}
}
的所有超类的链提供代码,直到扩展BugSpec
/ GebSpec
的代码,那么推理事情并提供帮助会更容易。在我看来,你可能正在处理一种气味,其中的测试是按照执行顺序的重要方式设置的。