如何为模块创建“获取器”(如何使用导航器实例化模块对象?)

时间:2018-07-11 21:34:36

标签: spock geb

我正在努力做到这一点,以便所有页面和模块引用都可以在intellij中自动完成。

由于某种错误,我无法像通常那样执行此操作。 (有关更多详细信息,请参见此处:How to have geb static content recognized form test script

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

例如:

页面:

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 Object并调用module(MyModule),但是我不确定它是如何工作的,或者不确定如何决定从哪个Navigator Object调用模块。

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

3 个答案:

答案 0 :(得分:3)

Book of Geb's section about modules回答了您的问题。您不应手动调用模块的构造函数,而应使用本章开头所述的语法。此解决方案摆脱了异常,还为我解决了代码完成问题:

static content = { 
  mod { module MyModule }
}

现在,异常消失了,如何添加您要求的吸气剂:

def myModule() { mod }

答案 1 :(得分:2)

我认为问题是您content封锁了。 Module是通过Navigator的{​​{1}}方法定义的:

module

因此不需要构造函数调用。

答案 2 :(得分:2)

从方法返回类型为扩展GroovyCastException的类的方法中返回包含模块的内容时,您会得到geb.Module,因为从内容定义返回的导航器和模块被包装在{{3 }}。

您可以使用as关键字解开它们,如关于geb.content.TemplateDerivedPageContent的手册部分所述。因此,对于您的一个示例,它看起来像这样:

MyModule mod(){
    mod as MyModule
}