spock - 如何为我的模块创建“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 对象调用模块。
总而言之,我只想能够从我的脚本中自动完成模块名称和静态内容。
解决方案
Geb 的关于模块的部分回答了您的问题。你不应该手动调用模块的构造函数,而是使用本章开头描述的语法。这个解决方案摆脱了异常,也为我解决了代码完成问题:
static content = {
mod { module MyModule }
}
现在这里的异常已经消失了,如何添加您要求的 getter:
def myModule() { mod }
推荐阅读
- c# - 修复一系列游戏对象
- docker - dockerfile-maven-plugin 在 gitlab-ci 注册表上推送图像
- c++ - 单击 wxToggleButton 时不捕获鼠标
- php - 将参数传递给控制器到用户模型中的方法
- javascript - ES6 中的 Map() 错误
- opencv3.0 - 使用opencv检测单色图像中的移动球
- python-3.x - 抓取嵌套数据并将它们插入单个数组
- java - 无法在 MacOS 中创建 Java 虚拟机
- amazon-web-services - 通过 Lambda 集成为多个 AWS API 提供单一配置
- ios - UIActivityViewController 无法分享图片