Ho appena scritto un test unitario per questa funzione, che scorre attraverso una raccolta di date e imposta proprietà uguali a true o false a seconda che siano prima o dopo una determinata data di confronto:
public void CheckHistory(int months)
{
var endDate = DateTime.Today.AddMonths(months);
Dictionary<Order, bool> orders = new Dictionary<Order, bool>();
foreach (var kvp in this.Orders)
{
if (kvp.Key.Date >= endDate)
{
orders.Add(kvp.Key, true);
}
else
{
orders.Add(kvp.Key, false);
}
}
this.OrderHistories = orders;
}
Quindi ecco il test che ho scritto:
public void Assert_CheckHistory_SelectsCorrectDates()
{
MyViewModel vm = GetVmWithMockRepository();
vm.OrderHistories = new Dictionary<OrderHistory, bool>();
OrderHistory ohOld = new OrderHistory();
ohOld.MailingDate = DateTime.Today.AddMonths(-12);
vm.OrderHistories.Add(ohOld, false);
OrderHistory ohNew = new OrderHistory();
ohNew.MailingDate = DateTime.Today.AddMonths(-3);
vm.OrderHistories.Add(ohNew, false);
vm.CheckOrderHist(-6);
int selectedOrders = vm.OrderHistories.Where(o => o.Value == true).Count();
Assert.AreEqual(1, selectedOrders, "Unexpected number of selected Order Histories");
}
Niente di sbagliato lì. Il test passa e tutto va bene con il mondo.
Tuttavia, sono ossessionato dal fastidioso sentimento che in realtà non sto testando nulla di utile, e sto solo scrivendo test per il bene.
Ho questo lotto . Una paranoia strisciante che i test che sto scrivendo sono incompleti nel senso che mentre coprono le linee di codice nella funzione obiettivo, non catturano realmente i probabili problemi e sono quindi solo un sovraccarico di manutenzione.
Vale la pena provare questo test campione? È persino un test mal progettato che vale la pena di non superare nessun test? E soprattutto ci sono dei principi per aiutare i programmatori a identificare se un test è utile o meno, o per guidarli nella costruzione di test utili in futuro?
Per essere chiari, sto aggiungendo test a un'applicazione esistente. Non è possibile eseguire test-first in vero stile TDD.