2013-03-05 17 views
13

mam test z pętli w ówczesnym klauzuli:testów jednostkowych Spock pętle w ówczesnej klauzuli

result.each { 
    it.name.contains("foo") 
    it.entity.subEntity == "bar" 
} 

for (String obj : result2) { 
    obj.name.contains("foo") 
    obj.entity.subEntity == "bar" 
} 

Nowo I uznał, że pętle nie są naprawdę testowany. Nie ważne czy mam foo, bar czy cokolwiek innego, test jest zawsze zielony :) Dowiedziałem się, że pętle muszą być testowane inaczej, np. z każdym'? Ale zmiana tylko "każdego" na "każdy" rzuca wyjątek:

result.every { 
    it.name.contains("foo") 
    it.entity.subEntity == "bar" 
} 

org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed: 
Spec expression: 1: expecting '}', found '==' @ line 1, column 61. 
    s("foo") it.entity.rootEntity == "bar" } 

Jak poprawnie używać pętli w teście? Używam Spocka 0,7-groovy-2.0

Odpowiedz

22

Albo używać jednoznacznych stwierdzeń dochodzić:

result.each { 
    assert it.name.contains("foo") 
    assert it.entity.subEntity == "bar" 
} 

lub pojedynczego wyrażenia logicznego ciągu every:

result.every { 
    it.name.contains("foo") && it.entity.subEntity == "bar" 
} 
+3

Uwaga! Pierwsze podejście wygeneruje bardziej czytelne komunikaty o błędach, ale zostanie ocenione jako "fałsz" (a operacja się nie powiedzie) w przypadku, gdy 'result' jest pustym zbieraniem! – Hubbitus

+0

Dodatkowe ostrzeżenie: druga metoda może natrafić na [obecnie nierozwiązany błąd] (https://github.com/spockframework/spock/issues/253), jeśli zamknięcie, które przełączysz na "co", jest wieloma liniami. – jonnybot

Powiązane problemy