So che questa è un'altra risposta tardiva, ma nel mio team che è bloccato nell'uso del framework MS Test, abbiamo sviluppato una tecnica che si basa solo su tipi anonimi per contenere una serie di dati di test e LINQ per eseguire il ciclo e testare ogni riga. Non richiede classi o framework aggiuntivi e tende ad essere abbastanza facile da leggere e comprendere. È anche molto più facile da implementare rispetto ai test basati sui dati utilizzando file esterni o un database connesso.
Ad esempio, supponi di avere un metodo di estensione come questo:
public static class Extensions
{
/// <summary>
/// Get the Qtr with optional offset to add or subtract quarters
/// </summary>
public static int GetQuarterNumber(this DateTime parmDate, int offset = 0)
{
return (int)Math.Ceiling(parmDate.AddMonths(offset * 3).Month / 3m);
}
}
È possibile utilizzare una matrice di tipi anonimi combinati a LINQ per scrivere test come questo:
[TestMethod]
public void MonthReturnsProperQuarterWithOffset()
{
// Arrange
var values = new[] {
new { inputDate = new DateTime(2013, 1, 1), offset = 1, expectedQuarter = 2},
new { inputDate = new DateTime(2013, 1, 1), offset = -1, expectedQuarter = 4},
new { inputDate = new DateTime(2013, 4, 1), offset = 1, expectedQuarter = 3},
new { inputDate = new DateTime(2013, 4, 1), offset = -1, expectedQuarter = 1},
new { inputDate = new DateTime(2013, 7, 1), offset = 1, expectedQuarter = 4},
new { inputDate = new DateTime(2013, 7, 1), offset = -1, expectedQuarter = 2},
new { inputDate = new DateTime(2013, 10, 1), offset = 1, expectedQuarter = 1},
new { inputDate = new DateTime(2013, 10, 1), offset = -1, expectedQuarter = 3}
// Could add as many rows as you want, or extract to a private method that
// builds the array of data
};
values.ToList().ForEach(val =>
{
// Act
int actualQuarter = val.inputDate.GetQuarterNumber(val.offset);
// Assert
Assert.AreEqual(val.expectedQuarter, actualQuarter,
"Failed for inputDate={0}, offset={1} and expectedQuarter={2}.", val.inputDate, val.offset, val.expectedQuarter);
});
}
}
Quando si utilizza questa tecnica è utile utilizzare un messaggio formattato che includa i dati di input nell'assert per identificare la riga che causa il fallimento del test.
Ho scritto sul blog di questa soluzione con più background e dettagli su AgileCoder.net .