Supponiamo di avere un metodo che convalida un oggetto prima di salvarlo in un DB. Restituisce indietro KVP qualcosa del tipo:
public KeyValuePair<bool, List<FooErrorReason>> ValidateABar(Bar b)
{
var reasons = new List<FooErrorReason>();
if (string.IsNullOrEmpty(bar.Name))
{
reasons.Add(new FooErrorReason { PropName = "Name", Message = "The name was missing" };
}
if (string.IsNullOrEmpty(bar.OtherName))
{
reasons.Add(new FooErrorReason { PropName = "OtherName", Message = "The other name was missing" };
}
return new KeyValuePair<bool, List<FooErrorReason>(reasons.Count == 0, reasons);
}
Quindi ora voglio testarlo, per una barra mancante. Nome, l'errore viene restituito. La mia domanda è sul make up del test, riguardo a cosa a Assert
.
public void ValidateABar_Fails_For_Missing_Name()
{
//arrange
var b = new Bar { OtherName = "Other" };
//act
var result = ValidateABar(b);
//assert
Assert.IsFalse(result.Key);
Assert.AreEqual(1, result.Value.Count);
Assert.IsTrue(result.Value.Any(x => x.PropName.Equals("Name")));
}
Ho il 3% di chiamate diAssert
e ha un odore di codice a questo proposito, ma non riesco a convincermi in alcun modo.
Mi sto chiedendo 'Cosa vuoi testare?' e credo che dovrei provare che questo non è stato possibile, ma non sono riuscito in modo specifico per la proprietà del test.
È sufficiente usare solo
Assert.IsTrue(result.Value.Any(x => x.PropName.Equals("Name")));
O dovrei anche controllare che non ci siano altri errori che ho rilevato lungo la strada?
Ad esempio, qualcuno ha aggiunto un'altra regola di convalida senza che io ne sia a conoscenza, penserei che vorrei che i miei test mi parlassero di questo la prossima volta che li ho eseguiti. Ad esempio, supponiamo che qualcuno abbia cambiato il metodo come segue:
public KeyValuePair<bool, List<FooErrorReason>> ValidateABar(Bar b)
{
var reasons = new List<FooErrorReason>();
if (string.IsNullOrEmpty(bar.Name))
{
reasons.Add(new FooErrorReason { PropName = "Name", Message = "The name was missing" };
}
if (string.IsNullOrEmpty(bar.OtherName))
{
reasons.Add(new FooErrorReason { PropName = "OtherName", Message = "The other name was missing" };
}
//added this!
if (string.IsNullOrEmpty(bar.ThirdName))
{
reasons.Add(new FooErrorReason { PropName = "ThirdName", Message = "The third name was missing" };
}
return new KeyValuePair<bool, List<FooErrorReason>(reasons.Count == 0, reasons);
}
Il test ora fallirebbe e vedrei che questa regola è stata aggiunta e modifico il mio test di conseguenza (e presumibilmente scriverò un altro test per coprire la nuova regola).
Sto prendendo anche la 'una sola regola Assert per test' letteralmente?