2013-03-05 15 views
13

Ho un test con i loop nella clausola then:unit test spock loop in poi clausola

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

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

Recentemente ho riconosciuto che gli anelli non sono realmente testati. Non importa se ho foo o bar o altro, il test è sempre verde :) Ho scoperto che i loop devono essere testati in modo diverso, ad es. con "ogni"? Ma semplicemente cambiando il "ciascuno" a "ogni" genera un'eccezione:

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" } 

Come dovrei utilizzare correttamente i loop nel mio test? Sto usando spock 0,7-groove-2,0

risposta

22

O utilizzare le istruzioni assert esplicite:

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

O una singola espressione booleana entro every:

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

Attenzione! Il primo approccio genererà messaggi di errore più leggibili ma verrà valutato come 'false' (e l'operazione fallirà) nel caso in cui' result' sia una raccolta vuota! – Hubbitus

+0

Avvertenza aggiuntiva: il secondo metodo può essere eseguito in [bug attualmente non risolto] (https://github.com/spockframework/spock/issues/253) se la chiusura che si passa a 'every' è composta da più righe. – jonnybot