Eu sei que esta é outra resposta tardia, mas em minha equipe que está presa ao uso da estrutura de teste do MS, desenvolvemos uma técnica que depende apenas de tipos anônimos para manter uma matriz de dados de teste e LINQ para percorrer e testar cada linha. Não requer classes ou estruturas adicionais e tende a ser bastante fácil de ler e entender. Também é muito mais fácil de implementar do que os testes orientados a dados usando arquivos externos ou um banco de dados conectado.
Por exemplo, digamos que você tenha um método de extensão como este:
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);
}
}
Você poderia usar uma matriz de Tipos Anônimos combinados com LINQ para escrever testes como este:
[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);
});
}
}
Ao usar essa técnica, é útil usar uma mensagem formatada que inclui os dados de entrada no Assert para ajudá-lo a identificar qual linha faz com que o teste falhe.
Eu escrevi sobre esta solução com mais informações e detalhes em AgileCoder.net .