2015-08-22 19 views
5

Ho appena notato che Spock non asserisce le condizioni se aggiungo una clausola if nel blocco aspettare come inStato da aspettarsi bloccare

def myTest() { 
    given: 
    a = true 

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

È possibile che questo prova passerà in quanto le condizioni non vengono controllati . Oppure il controllo delle condizioni non viene inoltrato passa l'istruzione if.

La soluzione a questo è quello di aggiungere assert dichiarazioni all'interno del blocco if, cioè affermare 1 == 2.

Quello che mi interessa è, è il motivo per cui la funzionalità è così? C'è un altro modo per aggirare questo? Suppongo che questo abbia qualcosa a che fare con Groovy se la funzionalità dell'istruzione, ma non conosco abbastanza bene i dettagli della lingua. Molto probabilmente l'istruzione if non restituisce nulla per il blocco previsto da Spock con cui lavorare.

+2

Non rispondere alla domanda, ma perché testare in questo modo? Non dovresti provare cose conosciute? Se ci sono percorsi diversi, non dovrebbero essere test diversi? –

+1

In secondo luogo che cosa ha detto Tim. Se il test fallisce, sei in grado di dire cosa ha fallito invece di una delle cose X fallito? Forse questo era solo un esempio, ma ogni test dovrebbe testare solo una cosa. Forse hai bisogno di un test simile con alcuni valori modificati? Se questo è il caso, dovresti prendere in considerazione la possibilità di esaminare la dichiarazione in spock. –

+0

@tim_yates @Aseem Il motivo dell'utilizzo di un'istruzione if durante il controllo delle condizioni è a causa della complessità dell'input di test e solo alcuni casi eccezionali ricadono nell'altro ramo di if, che in pratica si riduce alla pigrizia :) Il caso d'uso è qualcosa come 'Verifica che la condizione A sia soddisfatta a meno che X, in tal caso, controlla che la condizione B sia soddisfatta invece'. Potrebbe essere risolto con un blocco dove, ma per i miei gusti è troppo prolisso. – kaskelotti

risposta

6

Questo non ha nulla a che fare con Groovy. Spock's documentation afferma chiaramente che solo le espressioni di primo livello sono considerate in then e expect come condizioni. È di progettazione.

Cerca il collegamento per top.

+0

Sì, afferma che "tutte le espressioni di livello superiore in questi blocchi sono trattate implicitamente come condizioni". Se nell'esempio precedente il blocco if viene sostituito dall'operatore ternario, non è richiesta alcuna condizione esplicita con la parola chiave assert. Simile a un metodo di supporto per il controllo delle condizioni, è necessario specificare esplicitamente se l'istruzione. Fondamentalmente desidero sapere che esiste un collegamento tra i due, vale a dire se l'istruzione in realtà chiama una funzione in Groovy con void come return. – kaskelotti

+1

No, non lo è. È lo stesso di Java –

+0

Per riferimento futuro è possibile controllare http://www.groovy-lang.org/differences.html per scoprire se qualcosa funziona diversamente in Groovy rispetto a Java. –