首页 > 解决方案 > 如何为我的模块创建“getter”(如何使用导航器实例化模块对象?)

问题描述

我正在努力使我的所有页面和模块引用都可以在 intellij 中自动完成。

由于某种错误,我无法像往常一样做到这一点。(有关详细信息,请参见此处:如何让 geb 静态内容从测试脚本中识别

为了解决上述错误。我选择为我的所有静态内容创建“getter”。

例如:

这页纸:

class MyPage extends Page{
    static content = { 
        tab {$(By.xpath("somexpath")}
    }

    Navigator tab(){
        return tab
    }
}

剧本:

//imagine we are in the middle of a feature method here
def test = at MyPage
test.tab().click()

所以上面所有的代码都按我的预期工作,我想像这样重做我​​的页面,这样我就可以从脚本端自动完成。当我尝试对模块使用相同的技术时会出现问题。

例如:

class MyPage extends Page{
    static content = { 
        mod {module(new MyModule())}
    }

    MyModule mod(){
        return mod
    }
}

如果我尝试像这样从脚本中访问 mod

//imagine we are in the middle of a feature method here
def test = at MyPage
test.mod().someModContentMaybe().click()

我收到以下错误:

org.codehaus.groovy.runtime.typehandling.GroovyCastException: Cannot cast object 'MyPage' -> mod: 'MyModule' with class 'geb.content.TemplateDerivedPageContent' to class 'MyModule'

如果我尝试在页面对象中执行以下操作:

class MyPage extends Page{
    static content = { 
        mod {module(new MyModule())}
    }

    MyModule mod(){
        return new MyModule()
    }
}

尝试从脚本访问模块时出现以下错误:

geb.error.ModuleInstanceNotInitializedException: Instance of module class MyModule has not been initialized. Please pass it to Navigable.module() or Navigator.module() before using it.

我想它希望我获取一个实例化的 Navigator 对象并调用module(MyModule),但我不确定它是如何工作的,也不知道如何决定从哪个 Navigator 对象调用模块。

总而言之,我只想能够从我的脚本中自动完成模块名称和静态内容。

标签: spockgeb

解决方案


Geb 的关于模块的部分回答了您的问题。你不应该手动调用模块的构造函数,而是使用本章开头描述的语法。这个解决方案摆脱了异常,也为我解决了代码完成问题:

static content = { 
  mod { module MyModule }
}

现在这里的异常已经消失了,如何添加您要求的 getter:

def myModule() { mod }

推荐阅读