2015-08-22 40 views
5

Właśnie zauważyłem, że Spock nie dochodzić warunki jeśli dodać klauzulę if w bloku spodziewać jak wStan na oczekiwać zablokować

def myTest() { 
    given: 
    a = true 

    expect: 
    if (a) { 
     1 == 2 
    } 
    else { 
     1 == 1 
    }  
} 

Powyższy testu minie ponieważ nie są sprawdzane warunki . Albo sprawdzanie kondycji nie zostanie przekazane dalej, jeśli przekazuje instrukcję if.

Rozwiązaniem tego problemu jest dodanie assert oświadczenia wewnątrz bloku if, czyli dochodzić 1 == 2.

Co jestem zainteresowany jest, dlatego funkcjonalność jest tak? Czy istnieje inny sposób obejścia tego? Zakładam, że ma to coś wspólnego z Groovy, jeśli funkcja instrukcji, ale nie znam wystarczająco dobrze szczegółów językowych. Najprawdopodobniej instrukcja if nie zwraca niczego, z czym mógłby oczekiwać blok Spocka.

+2

Brak odpowiedzi na pytanie, ale dlaczego miałbyś testować w ten sposób? Nie powinieneś testować znanych rzeczy? Jeśli istnieją różne ścieżki, czy nie powinny to być różne testy? –

+1

Oddanie, co powiedział Tim. Jeśli test się nie powiedzie, będziesz w stanie powiedzieć, co dokładnie zakończyło się niepowodzeniem, a nie jedną z rzeczy X? Być może był to tylko przykład, ale każdy test powinien testować tylko jedną rzecz. Być może potrzebujesz podobnego testu z pewnymi wartościami zmienionymi? Jeśli tak jest, powinieneś rozważyć sprawdzenie, gdzie znajduje się instrukcja w spocku. –

+0

@tim_yates @Aseem Przyczyną użycia instrukcji if przy sprawdzaniu warunków jest złożoność danych wejściowych testu i tylko kilka wyjątkowych przypadków wpada w drugą gałąź, która zasadniczo sprowadza się do lenistwa :) Przypadek użycia jest czymś jak 'Sprawdź, czy warunek A jest spełniony, chyba że X, w takim przypadku sprawdź, czy warunek B jest spełniony zamiast'. Może być rozwiązany z blokiem, ale na mój gust jest zbyt szczegółowy. – kaskelotti

Odpowiedz

6

To nie ma nic wspólnego z groovy. Spock documentation wyraźnie stwierdza, że ​​tylko wyrażeń najwyższego poziomu są traktowane jako then i expect jako warunki. Jest to zgodne z projektem.

Wyszukaj link do góry.

+0

Tak, stwierdza, że ​​'wszystkie wyrażeń najwyższego poziomu w tych blokach są niejawnie traktowane jako warunki. Jeśli w powyższym przykładzie blok if zostanie zastąpiony przez operatora potrójnego, nie jest wymagany żaden wyraźny warunek dla słowa kluczowego assert. Podobnie jak przy korzystaniu z metody pomocnika, sprawdzanie warunku wymaga wyraźnej deklaracji w instrukcji if. Zasadniczo chciałbym wiedzieć, czy istnieje związek między tymi dwoma, tj. Czy instrukcja faktycznie jest wywołaniem funkcji w Groovy z pustką jako zwrotem. – kaskelotti

+1

Nie, nie jest. To samo, co Java –

+0

. W celu późniejszego wykorzystania sprawdź http://www.groovy-lang.org/differences.html, aby dowiedzieć się, czy coś działa inaczej w porównaniu z Javą. –