使用带参数的Geb静态内容DSL时的IntelliJ类型错误

时间:2017-06-26 15:54:05

标签: intellij-idea groovy dsl geb

每当我使用带参数的静态内容定义的闭包时,IntelliJ会抱怨类型不匹配(即使我在闭包内指定了类型)。

例如,如果我使用此静态内容块:

static content = {
        myModule { $('myModule').module(CustomModule) }
        namedModule { String name -> $(".$name").module(CustomModule) }
}

上述两个项目都可以在我的测试中成功使用,但如果我在我的一个测试中使用'namedModule',如下所示:

page.namedModule("moduleName").moduleMethod("blah blah blah")

IntelliJ将以黄色突出显示参数“moduleName”,错误为:

  

'namedModule'不能应用于'(java.lang.String)'

我们试图以一种方式重构我们的测试,这意味着您可以更轻松地浏览代码(例如,避免IntelliJ无法解决的任何Geb / Groovy'魔术'),这是最后一个阻止的问题之一这是可能的。

1 个答案:

答案 0 :(得分:0)

这是IntelliJ中Geb支持的已知限制。 IntelliJ始终将内容定义视为页面和模块的属性,即使它们可以进行参数化。鉴于IntelliJ中的Geb支持是开源的,我们可能会增加对此的支持。

同时,作为一种解决方法,您可以使用参数化内容的方法而不是内容定义,IntelliJ将能够理解这些并能够重构它们:

void namedModule(String name) {
    $(".$name").module(CustomModule)
}

但有一些警告:

  • 你将失去使用content definition options的能力;如果您需要将这些用于内容定义,那么我建议创建一个参数化的"私有"内容定义(例如,名称开头有_),您只能从页面或模块中访问
  • 即使返回的内容为空,也不会抛出
  • RequiredPageContentNotPresent;要解决这个问题,你需要为每个这样的方法添加手动验证,或者使用第一个要点中概述的策略,使用" private"内容定义