Ho una classe che è responsabile per l'esecuzione di conversioni da / a tipi di venti-qualcosa. Chiamiamo questa classe ConvertUtils
.
Per i programmatori C # là fuori - questa classe espande la classe .Net Convert
.
Sembra qualcosa del tipo:
public static class ConvertUtils {
public static object ChangeType(object obj, Type newType) {
if (conversionSupportedByFramework)
return Convert.ChangeType(obj, newType);
else
ConvertSpecialCases(obj, newType);
}
}
Come faresti a testarlo? Suppongo che abbiamo bisogno di testare questo codice in black-box.
I due modi in cui abbiamo pensato sono:
- Scrittura di 400+ test unitari - copre tutte le combinazioni da / a quelle a cui possiamo pensare.
- Scrivi test solo per le nuove conversioni - quelle non supportate dalla classe
Convert
- in realtà testando solo la funzioneConvertSpecialCases()
[che non è il nostro obiettivo, come detto sopra]
Il vantaggio della prima possibilità è di avere troppi test - il che prolunga i tempi di costruzione, implica il mantenimento di più codice, ecc.
Il controllo della seconda possibilità è di non controllare completamente la responsabilità della classe -
cosa succede se una determinata istruzione if
decide di implementare una logica personalizzata (errata), invece di lasciare che Convert
faccia il suo lavoro? per esempio. appena prima che if (conversionSupportedByFramework)
qualcuno decida di chiamare qualche logica personalizzata?
Che cosa ne pensi di questo problema?