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

IntelliJ type error when using Geb static content DSL with parameters

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

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

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

以上两项都可以在我的测试中成功使用,但是如果我要在我的测试之一中使用 'namedModule' 如下:

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

IntelliJ 将以黄色突出显示参数 "moduleName" 并显示错误:

'namedModule' cannot be applied to '(java.lang.String)'

我们正在尝试以一种方式重构我们的测试,这意味着您可以更轻松地浏览代码(例如,避免任何 IntelliJ 无法解析的 Geb/Groovy 'magic'),这就是一个最后剩下的问题阻止了这成为可能。

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

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

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

不过有一些注意事项:

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