gpt4 book ai didi

testing - 除非使用@Stepwise,否则类无法将模块解析为内容

转载 作者:行者123 更新时间:2023-11-28 19:53:08 25 4
gpt4 key购买 nike

我有一个 Spock 类,当作为测试套件运行时,抛出 Unable to resolve iconRow as content for geb.Page, or as a property on its Navigator context. Is iconRow a class you forgot to import?除非我用@Stepwise 注释我的类(class)。但是,我真的不希望测试执行在第一次失败时停止,@Stepwise 确实如此。

我尝试使用 this 编写(复制和粘贴)我自己的扩展程序发布,但我仍然收到这些错误。它正在使用我的扩展程序,因为我添加了一些打印到控制台的日志记录语句。

这是我的模块之一:

class IconRow extends Module {
static content = {
iconRow (required: false) {$("div.report-toolbar")}
}
}

以及使用它的页面:

class Report extends SomeOtherPage {
static at = {$("div.grid-container").displayed}

static content = {
iconRow { module IconRow }
}
}

还有一段失败的测试:

class MyFailingTest extends GebReportingSpec {

def setupSpec() {
via Dashboard
SomeClass.login("SourMonk", "myPassword")
assert page instanceof Dashboard

nav.goToReport("Some report name")
assert page instanceof Report
}

@Unroll
def "I work"() {
given:
at Report

expect:
this == that

where:
this << ["some list", "of values"]
that << anotherModule.someContent*.@id
}

@Unroll
def "I don't work"() {
given:
at Report

expect:
this == that

where:
this << ["some other", "list", "of values"]
that << iconRow.columnHeaders*.attr("innerText")*.toUpperCase()
}
}

作为套件执行时 I work通过和I don't work失败,因为它无法将“iconRow”标识为页面的内容。如果我切换测试用例的顺序,I don't work将通过并且I work将失败。或者,如果我分别执行每个测试,它们都会通过。

我尝试过的:

  • 添加/删除 required: true模块内容的属性
  • 在模块名称前加上类前缀,例如IconRow.iconRow
  • 将我的模块定义为静态 @Shared属性
  • 初始化我的 setupSpec() 内部和外部的模块
  • 在返回模块的每个模块类中制作简单的 getter 方法,并引用诸如 IconRow.getIconRow().columnHeaders*.attr("innerText")*.toUpperCase() 等内容
  • 移动我的 setupSpec() 的内容进入setup()
  • 正在添加 autoClearCookies = false进入我的 GebConfig.groovy
  • 制作@Shared Report report变量并为所有模块添加前缀,例如 report.iconRow

关于最后一个要点的非常特别的注释 -- 它神奇地解析了没有前缀的模块 -- 所以它不会解析 report.IconRow但只会解决 iconRow -- 绝对奇怪,因为如果我删除该变量,那么之前刚刚工作的模块突然无法再次解析。我什至尝试声明此变量,然后不添加任何前缀,但这也没有用。

另一个让我一直苦苦思索的问题是,我也不确定问题出在哪里。它抛出的错误让我相信这是一个项目设置问题,但单独运行每个功能都可以正常工作,所以它似乎可以很好地解析类。

另一方面,也许这是 session 和/或 cookie 的问题?虽然我还没有看到任何官方文档,但似乎普遍认为(从我读过的其他帖子和文章)只使用 @Stepwise将在功能方法之间维护您的 session 。如果是这样,为什么我的扩展程序不起作用?它几乎是 @Stepwise 的复制和粘贴。没有 skipFeaturesAfterFirstFailingFeature方法(如果需要我可以发布),除非在幕后使用 @Stepwise 进行其他操作.

对于文字墙的道歉,但我已经尝试解决这个问题大约 6 个小时了,所以我的大脑很炸。

最佳答案

Geb 对 @Stepwise 有特别的支持,如果用它注释规范,它不会在每次测试后调用 resetBrowser(),而是在规范之后调用完成了。查看 github 上的代码

所以基本上您需要将 setupSpec 更改为 setup 以便在每次测试之前执行它。

根据您的观察,如果您只是运行一个重点测试,则会为该测试执行 setupSpec,因此它会通过。问题出现了,之后会调用清理并重置浏览器,从而破坏后续测试。

编辑

我忽略了您对 where block 的使用,where block 中的所有内容都需要静态 (@Shared) 可用,因此使用实例级构造将不起作用。重置浏览器也会杀死所有引用,所以在不起作用之前获取它。基本上,不要在 where block 中使用 Geb 对象!

查看您的代码,但我看不出有任何理由在这里使用数据驱动测试。

  1. 这可以在正常测试中使用一个断言轻松完成
  2. 单元测试最好只测试一件事。然而,Geb 不是单元测试,而是验收/前端测试。这里的问题是它们比单元测试慢得多,将合理的断言组合到一个测试中是有意义的。

class MyFailingTest extends GebReportingSpec {
def setup() {
via Dashboard
SomeClass.login("SourMonk", "myPassword")
assert page instanceof Dashboard

nav.goToReport("Some report name")
assert page instanceof Report
}

def "I work"() {
given:
at Report

expect:
["some list", "of values"] == anotherModule.someContent*.@id
}

def "I don't work"() {
given:
at Report

expect:
["some other", "list", "of values"] == iconRow.columnHeaders*.attr("innerText")*.toUpperCase()
}
}

关于testing - 除非使用@Stepwise,否则类无法将模块解析为内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46435166/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com