Testing 类无法将模块解析为内容,除非使用@Stepwise

Testing 类无法将模块解析为内容,除非使用@Stepwise,testing,automation,spock,geb,Testing,Automation,Spock,Geb,我有一个Spock类,当作为测试套件运行时,抛出无法将iconRow解析为geb.Page的内容,或作为其导航器上下文的属性。iconRow是您忘记导入的类吗?除非我用@Stepwise注释我的类。然而,我真的不希望测试执行在第一次失败时停止,就像@Stepwise那样 我曾尝试使用post编写(复制和粘贴)我自己的扩展,但仍然会出现这些错误。它使用我的扩展,因为我添加了一些打印到控制台的日志语句 以下是我的一个模块: class IconRow extends Module { sta

我有一个Spock类,当作为测试套件运行时,抛出
无法将iconRow解析为geb.Page的内容,或作为其导航器上下文的属性。iconRow是您忘记导入的类吗?
除非我用@Stepwise注释我的类。然而,我真的不希望测试执行在第一次失败时停止,就像@Stepwise那样

我曾尝试使用post编写(复制和粘贴)我自己的扩展,但仍然会出现这些错误。它使用我的扩展,因为我添加了一些打印到控制台的日志语句

以下是我的一个模块:

class IconRow extends Module {
    static content = {
        iconRow (required: false) {$("div.report-toolbar")}
    }
}
以及使用它的页面:

class Report extends SomeOtherPage {
    static at = {$("div.grid-container").displayed}

    static content = {
        iconRow { module IconRow }
    }
}
以及失败的测试片段:

class MyFailingTest extends GebReportingSpec {

    def setupSpec() {
        via Dashboard
        SomeClass.login("SourMonk", "myPassword")
        assert page instanceof Dashboard

        nav.goToReport("Some report name")
        assert page instanceof Report
    }

    @Unroll
    def "I work"() {
        given:
        at Report

        expect:
        this == that

        where:
        this << ["some list", "of values"]
        that << anotherModule.someContent*.@id
    }

    @Unroll
    def "I don't work"() {
        given:
        at Report

        expect:
        this == that

        where:
        this << ["some other", "list", "of values"]
        that << iconRow.columnHeaders*.attr("innerText")*.toUpperCase()
    }
}
class MyFailingTest扩展了GebReportingSpec{
def setupSpec(){
通过仪表板
SomeClass.login(“SourMonk”、“myPassword”)
断言仪表板的页面实例
导航goToReport(“某些报告名称”)
断言报表的页实例
}
@展开
定义“我工作”(){
鉴于:
在报告中
期望:
这个=那个
哪里:

此Geb对
@逐步
有特殊支持,如果使用它注释规范,则在每次测试后它不会调用
resetBrowser()
,而是在规范完成后调用。请参阅上的代码

因此,基本上您需要将
setupSpec
更改为
setup
,以便在每次测试之前执行

根据您的观察,如果您只是运行一个集中测试,则会对该测试执行
setupSpec
,因此它会通过。问题是,随后会调用清理并重置浏览器,从而中断后续测试

编辑

我忽略了您使用的
where
块,where块中的所有内容都需要静态(
@Shared
)可用,因此使用实例级构造将不起作用。重置浏览器也将杀死所有引用,因此之前获取引用也不起作用。基本上,不要在
where
块中使用Geb对象

但是,看看你的代码,我看不出有任何理由在这里使用数据驱动测试

  • 在一个普通测试中,只需一个断言就可以很容易地做到这一点
  • 单元测试只测试一件事是一个很好的实践。然而,Geb不是一个单元测试,而是一个验收/前端测试。这里的问题是,它们比单元测试慢得多,将合理的断言组合到一个测试中是有意义的

  • 因此,我尝试将setupSpec()的内容移动到setup()中测试仍然失败,出现了同样的错误。在GebSpec中是否有重写这些方法的方法?谢谢,Leonard,这是为我工作的--我想我对框架有一个简单的误解。那么,是什么允许在“expect”中访问Geb对象而不是在“where”中访问呢?@SourMonk
    where
    是“执行”的在实际测试运行之前,因为它为测试提供了输入数据,所以这通常不是问题,除非使用了非静态数据。
    expect
    是测试本身的一部分。这里的图像可能有助于更好地理解它
    
    class MyFailingTest extends GebReportingSpec {    
        def setup() {
            via Dashboard
            SomeClass.login("SourMonk", "myPassword")
            assert page instanceof Dashboard
    
            nav.goToReport("Some report name")
            assert page instanceof Report
        }
    
        def "I work"() {
            given:
            at Report
    
            expect:
            ["some list", "of values"] == anotherModule.someContent*.@id
        }
    
        def "I don't work"() {
            given:
            at Report
    
            expect:
            ["some other", "list", "of values"] == iconRow.columnHeaders*.attr("innerText")*.toUpperCase()
        }
    }