Come dovrebbe apparire un test per un requisito "per ogni diverso da x return false"

1

Ho cercato di scoprire se c'è una domanda simile ma non sapevo nemmeno quali parole chiave dovrei usare:)

Ho ottenuto un metodo in un'interfaccia accettando un'altra interfaccia come parametro:

bool CanDoIt(AnInterface subject)

Una delle implementazioni deve soddisfare il requisito che il metodo restituisca false per tutti i tipi di calcestruzzo (implementando AnInterface) diverso da X.

Potrebbe esserci un'implementazione semplice (non l'ho scritta dal momento che non ha ottenuto UT per questo):

bool CanDoIt(AnInterface subject)
{
    if(!(subject is X)) return false;
    else ...
}

So che questo è un odore di codice che accetta un'interfaccia e poi ne controlla il tipo concreto - sfortunatamente per ora ho avuto il merito di farlo.

Vorrei scrivere un test per verificare se il requisito è implementato correttamente. In modo che il test fallirebbe se qualcuno aggiungesse mai un nuovo tipo implementando AnInterface e cambiasse il metodo per non soddisfare il requisito.

Se scrivere un test del genere non è possibile, cosa posso fare per considerare il test codificato? Sarebbe sufficiente scrivere un test usando pochi tipi esemplari, o è meglio non scriverlo affatto?

    
posta Grzegorz Sławecki 15.05.2013 - 22:11
fonte

3 risposte

0

Alcuni sistemi di test unitario consentono di aggiungere un test unitario su un'interfaccia, con il sistema di test che esegue quel test su qualsiasi classe che implementa tale interfaccia. Su un sistema del genere, potresti semplicemente scrivere un test che chiama CanDoIt e asserisce che o ha restituito false o that AnInterface is X . Un "test" simile sarebbe, se si utilizza un framework di contratto, aggiungere un contratto come Contract.Promises(Contract.ReturnValue == (subject is X)); a CanDoIt .

Se il tuo sistema non supporta nessuna di queste strategie, potrebbe essere meglio chiedere una versione specifica del framework di test di questa domanda (su SO).

    
risposta data 15.05.2013 - 22:39
fonte
0

Non è possibile risolvere il problema di progettazione con il test.

Potresti scrivere un test per ogni implementazione nota di AnInterface . Quando qualcuno crea una nuova implementazione, scriverebbe un nuovo test per CanDoIt .

Sembra che CanDoIt debba essere un metodo su AnInterface . Se puoi, ti suggerisco di creare un metodo CanDoIt su AnInterface e di delegare il metodo a AnInterface .

    
risposta data 15.05.2013 - 22:37
fonte
0

Non penso che tu possa, perché qualcuno può facilmente scrivere

bool CanDoIt(AnInterface subject)
{
    if(!(subject is X || subject is Y)) return false;
    else ...
}

e non sai in anticipo sulla nuova classe Y.

Il solo chiamare CanDoIt(someBogusClassThatImplementsAnInterface) non funzionerebbe ancora

Dovresti comunque chiamare CanDoIt(someBogusClassThatImplementsAnInterface) per assicurarti che qualcuno non rimuova semplicemente il controllo del tipo in CanDoIt() , ma per ottenere una copertura completa dovrai rimuovere il codice dell'odore e richiedere CanDoIt() accetta solo X invece di anything that implements the interface . Poiché hai notato che questa non è un'opzione, sei praticamente bloccata.

    
risposta data 15.05.2013 - 22:24
fonte

Leggi altre domande sui tag