Uso spesso enum
tipi nel mio codice con un passaggio per applicare la logica a ciascun tipo. In questi casi è importante che ogni enum
abbia implementato il codice.
Ad esempio;
public enum eERROR
{
REQUIRED,
DUPLICATE,
UNKNOWN,
MISSING_VALUE
}
public void Error(eERROR pError)
{
switch (pError)
{
case eERROR.REQUIRED:
// ......
return;
case eERROR.DUPLICATE:
// ......
return;
case eERROR.MISSING_VALUE:
// ......
return;
case eERROR.UNKNOWN:
// ......
return;
}
throw new InvalidArgumentException("Unsupported error type");
}
In fondo ho aggiunto un'eccezione come ultima risorsa per verificare che un programmatore si sia ricordato di aggiungere nuovi tipi di enum
all'istruzione switch
. Se un nuovo tipo viene aggiunto a eERROR
, l'eccezione potrebbe essere generata se il codice non viene aggiornato.
Ecco il mio problema.
Il codice sopra riportato genera una copertura del test unitario di solo 99% perché non posso attivare l'eccezione. Potrei aggiungere un generico unhandled
a eERROR
e chiamare Error(eERROR.unhandled)
solo per ottenere una copertura 100% , ma mi sembra un trucco per risolvere qualcosa che non è un problema solo per ottenere una copertura completa . Potrei rimuovere la linea ma poi non ho il controllo di sicurezza.
Perché il 99% è un problema? perché la base di codice è così grande che qualsiasi metodo scoperto non sposta la copertura a 98% . Quindi vedo sempre 99% e non so se ho perso un metodo o due.
Come posso riscrivere Error()
in modo che tutte le enumerazioni aggiunte di recente che non vengono aggiunte allo switch vengano catturate in qualche modo dal programmatore e siano anche coperte dai test. C'è un modo per farlo senza aggiungere un dummy enum?