gpt4 book ai didi

groovy - 有没有办法防止 Geb 从 void 方法返回 null?

转载 作者:行者123 更新时间:2023-12-04 18:03:50 25 4
gpt4 key购买 nike

在 Spock 规范中 中的任何一行期望:然后:块被评估并断言为 boolean , 除非它有返回类型 void 的签名.

我注意到声明为 void 的方法有些奇怪。在从 Navigator 继承的任何类上(例如 PageModule 类)。

假设我们有这样的例子:

class NavigationSpec extends GebSpec {

def 'Collections page has a right header'() {

when:
to CollectionsPage

then:
hasHeaderText('Collections')
}
}
hasHeaderText()方法在 CollectionsPage 中定义类如下:
class CollectionsPage extends Page {

static url = 'movies/collections'

void hasHeaderText(String expectedText) {
assert true
}
}

故意我只是断言 true在那里,所以它永远不会失败。即使它失败并出现错误:
Condition not satisfied:

hasHeaderText('Collections')
|
null

如何以及为什么 void方法调用结果被评估为 null ?

我知道如何“修复它”。将方法返回类型声明为 boolean 就足够了并返回 true .这很丑陋,因为遵循所有否则不必要的断言 return true必须添加如下:
boolean hasHeaderText(String expectedText) {
assert header.text() == expectedText
return true
}

但这只会引起噪音。有什么办法可以阻止Geb返回 null来自 void方法?

当然,我知道这个特定案例可能是这样的:
boolean hasHeaderText(String expectedText) {
header.text() == expectedText`
}

这并不能解释丢失 void 的奇怪之处返回类型,更不用说我们用这种方法丢失了有意义的断言失败消息。

最佳答案

每个方法都返回一个值是 Groovy 语言的一部分。这允许在表达式中或作为 lambda 使用任何方法。

所有声明的方法 void返回 null .

如果您没有明确的 return 语句,则返回方法中最后一个表达式的结果。

您可以查看字节码……即使您声明了返回类型,实际上也不需要返回任何内容,因为 Groovy 默认会返回 null:

// returns null
String callMe() { }

static void main(args) {
def x = callMe()
assert x == null
println "OK!"
}

因为 Spock 会断言 then 中的任何内容这不是一个简单的赋值块,你需要避免在 then 中做 bool 断言以外的任何事情。堵塞。即使允许分配变量,也应该避免…… 保持测试干净和清晰是很困难的,从长远来看,坚持这些准则确实对你有用,而不是对你不利。

因此,编写您想要的断言的正确方法是让您的方法返回一个 bool 值:
boolean hasHeaderText(String expectedText) {
header.text() == expectedText
}

并在 then 中使用它堵塞:
then: 'The header has the expected text #expectedText'
hasHeaderText expectedText

如果你问我,看起来很不错。

编辑

我注意到 Groovy/Spock 实际上会 不是 即使在 then 中也断言普通 void 方法的结果阻止...这里可能发生的情况是您没有正常的 void 方法,您似乎正在调用 CollectionsPage 的动态方法(我猜这就是 Geb 的魔法在起作用),这意味着 Spock AST Transformer 可能没有机会检查您正在调用的方法的签名,因此它正确地假设它必须断言结果......至少它是这样的。

关于groovy - 有没有办法防止 Geb 从 void 方法返回 null?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36549325/

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