groovy - Geb+Spock 测试无法重用内容 Controller ,失败并出现 MissingMethodException

标签 groovy spock geb

我最近才开始为我们的 Web 应用程序创建 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 的父类(super class):

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()
    }        
}

最佳答案

使用内置基 GebSpec/GebReportingSpec 时,Geb 会将缺失的方法调用分派(dispatch)给规范的 browser< 的 page 属性 属性。在第一次测试之前,某些东西(没有看到更多代码就不可能说出它到底是什么)将该属性设置为 TraderApp 的实例。 Geb 在每次测试之间重新创建 browser 实例,这意味着页面实例将重置为默认值,即 Page 的实例。如果您将页面设置为 TraderApp 的实例,则将找到 tile() 方法:

def "test2"() {
    given:
        page TraderApp
        tile(CURPAIR).amount.click()

    when: println("bar")

    then:
        waitFor {true} 
}

如果您为 BugSpec 的所有父类(super class)链提供代码,直到扩展 GebSpec/GebReportingSpec。在我看来,您可能正在处理一种气味,其中测试的设置方式与执行顺序很重要。

关于groovy - Geb+Spock 测试无法重用内容 Controller ,失败并出现 MissingMethodException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26379928/

相关文章:

jenkins - @NonCPS 在第一个构建步骤后停止

java - 无法在 Spock 中断言值

grails - WithNewWindow() 在 Geb 中返回 MultipleCompilationErrorsException

elasticsearch - Elasticsearch Groovy脚本eachWithIndex

grails - Grails Controller 和继承/关闭

groovy - Spock - 模拟 Groovy 闭包方法?

eclipse - 在 Eclipse 中突出显示 Spock 测试关键字

java - Geb - IncompatibleClassChangeError

Grails, Geb, Selenium w/Chrome : Unable to Connect?

excel - 在grails中实现excel导入的高效方法