Come faccio a verificare l'unità con un metodo privato che viene chiamato in un ciclo come questo:
// Calls MethodToUnitTest in a loop
public static string Generate(params int[] values)
{
if (values.Any(i => i == 0)) // return empty string if any value contains 0
return "";
return string.Join(", ", values.Select(MethodToUnitTest)); // return a comma delimited string
}
// Called multiple times by Generate
private static string MethodToUnitTest(int value)
{
if (value % 2 == 0)
return "Divisible by 2";
if (value % 3 == 0)
return "Divisible by 3";
return value.ToString();
}
Posso vedere due opzioni:
-
Cambia la visibilità di
MethodToUnitTest
inpublic
(e possibilmente spostalo in un'altra classe) quindi scrivi i codici di test unitario che lo esercitano.Con: l'output di
MethodToUnitTest
è solo perGenerate
, quindi non è necessario renderlo pubblico o spostarlo in un'altra classe. Inoltre,MethodToUnitTest
è solo una semplice funzione. -
Prova
MethodToUnitTest
chiamandoGenerate
: Contro: Semplicemente innaturale.
Sample tests
Assert.AreEqual("Divisible by 2", Generate(2));
Assert.AreEqual("Divisible by 3", Generate(3));
Assert.AreEqual("Divisible by 2, Divisible by 3", Generate(2, 3));
// ...etc
Quale soluzione è migliore? A che punto dividi un metodo in più metodi testabili individualmente?