In einer Spock Spezifikation jede Linie in erwarten: oder dann: Block ausgewertet wird und behauptet als boolean
, es sei denn, es Unterschrift mit Rückgabetyp void
hat.Gibt es eine Möglichkeit, zu verhindern, dass Geb Null von void-Methoden zurückgibt?
Ich habe bemerkt, dass es für Methoden wie void
für jede Klasse von Navigator
vererben erklärt etwas seltsam los ist (zum Beispiel Page
oder Module
Klassen).
Lassen Sie sagen, wir solches Beispiel haben:
class NavigationSpec extends GebSpec {
def 'Collections page has a right header'() {
when:
to CollectionsPage
then:
hasHeaderText('Collections')
}
}
Die hasHeaderText()
Methode wird innerhalb CollectionsPage
Klasse wie folgt definiert:
class CollectionsPage extends Page {
static url = 'movies/collections'
void hasHeaderText(String expectedText) {
assert true
}
}
Absichtlich ich behaupten nur true
es über so sollte es nie Scheitern. Auch wenn es nicht mit einem Fehler:
Condition not satisfied:
hasHeaderText('Collections')
|
null
Wie und warum ein void
Methodenaufruf Ergebnis als null
ausgewertet wird?
Ich weiß, wie man es "repariert". Es reicht, den Rückgabetyp der Methode als boolean
zu deklarieren und true
zurückzugeben. Dies ist zwar hässlich, wie folgend alle behauptet sonst unnötig return true
hat wie hinzugefügt werden:
boolean hasHeaderText(String expectedText) {
assert header.text() == expectedText
return true
}
Dies führt allerdings nur Rauschen. Gibt es eine Möglichkeit, Geb zu verhindern, null
von void
Methoden zurückzugeben?
Ich bin natürlich bewusst, dass dieser spezielle Fall wie gehen könnte:
boolean hasHeaderText(String expectedText) {
header.text() == expectedText`
}
Das die Kuriosität des verlorenen void
Rückgabetypen nicht erklären, nicht zu erwähnen wir sinnvoll Assertion Fehlermeldung verlieren mit solcher Ansatz.
Danke für Ihre Antwort. Ich bin mir der Dinge bewusst, die du geschrieben hast, besonders den Teil, in dem du Notizen bearbeitest. In der Tat sollte die void-Methode nicht als assert in spocks then block ausgewertet werden. Pages Methode wird als normaler Weg deklariert, aber das ist auch meine Annahme, dass Geb etwas AST-Magie damit macht und damit den Vertrag bricht. Die Verwendung von Booleans mit 'expectedText' außerhalb der Methode ist weit entfernt von dem, was ich erreichen möchte. Power-Assert-ausgearbeitete Fehlermeldungen gehen verloren (denken Sie zB daran, zwei Karten zu vergleichen) und der Text muss jedes Mal wiederholt werden, wenn die Methode verwendet wird (DRY). Ich halte das für einen Geb-Bug – topr