Spero di poter fare una domanda chiara ... Ho semplificato il mio esempio di codice per questa domanda, spero che abbia ancora senso.
public class PersonComponent
{
public bool IsQualified(Person person)
{
if (person.PropertyA){ return true; }
if (person.PropertyB && !person.PropertyC) { return true; }
if (VeryDifficultFunction(person.Certificates))
{
return true;
}
return false;
}
private bool VeryDifficultFunction(List<Certificate> certificates)
{}
}
public class Person
{
public bool PropertyA { get; set; }
public bool PropertyB { get; set; }
public bool PropertyC { get; set; }
public List<Certificate> Certificates { get; set; }
}
public class Certificate
{ }
Ho un personcomponent
che determina se un dato person
è qualificato o meno.
Oltre ad alcune semplici convalide su proprietà A
, B
e C
c'è un albero delle decisioni complicato nella lista di Certificates
della Persona.
Ora quando implemento questa decisione complicata in PersonComponent
creerei tutti i test unitari su PersonComponent (diciamo che il numero di test è 12).
Quindi, decido che questa conoscenza (l'albero delle decisioni complicato) sia troppa conoscenza per personcomponent
, quindi la refactoring in una nuova classe, personCertificatescomponent
.
Diciamo che questa classe ora assomiglia a questa:
public class PersonCertificatesComponent
{
public bool GetVeryDifficultFunctionResult(List<Certificate> certificates)
{}
}
Ora, cosa devo fare con i miei (12) test unitari per questo specifico codice?
DEVI MOVIMERli per operare su personCertificatescomponent
?
Pro:
Sembra una buona idea perché il personCertificatescomponent
viene quindi testato separatamente (cosa che ritengo sia buona se qualcuno vuole riutilizzare questo componente), E (che è un grande vantaggio imo) Non devo impostare l'unità verifica il personcomponent
ogni volta con i giusti valori per PropertyA/B/C
, quindi raggiunge la parte VeryDifficultFunction
.
Ho separato i test unitari per le 2 classi in modo da rendere il mio codice più "chiaro" (In qualche modo mi piacciono 2 classi con 8 test unitari meglio di 1 classe con 16 test unitari, ma forse è qualcosa che dovrei disimparare)
CONS:
Ma ora non ho più i test su personcomponent
. Un'idea che è venuta fuori è stata testare l'unità se è stato utilizzato personCertificatescomponent
(test di simulazione), ma poi sono legato al mio test unitario all'implementazione di personcomponent
O li COPIA, quindi personCertificatescomponent
AND personcomponent
sono entrambi testati unitamente? (che sembra bello, ma copiare i test non sembra SECCO)
O lascio i test dove sono? (pro e contro inverso di spostare i test di unità).
Non posso sopportare di non avere una buona risposta per me stesso .....