In un sacco di tutorial TDD vedo codice come questo:Unit Testing e di codificazione design
public class MyClass
{
public void DoSomething(string Data)
{
if (String.IsNullOrWhiteSpace(Data))
throw new NullReferenceException();
}
}
[Test]
public DoSomething_NullParameter_ThrowsException()
{
var logic = MyClass();
Assert.Throws<NullReferenceException>(() => logic.DoSomething(null));
}
tutto questo ha un senso, ma ad un certo punto si sta per raggiungere la classe che utilizza effettivamente MyClass e si desidera per verificare che l'eccezione è gestita:
public class EntryPointClass
{
public void DoIt(string Data)
{
var logicClass = new MyClass();
try
{
logicClass.DoSomething(Data);
}
catch(NullReferenceException ex)
{
}
}
}
[Test]
public DoIt_NullParameter_IsHandled()
{
var logic = new EntryPointClass()
try
{
logic.DoIt(null);
}
catch
{
Assert.Fail();
}
}
Quindi perché non mettere il try/catch in MyClass, in primo luogo, piuttosto che gettare l'eccezione e avere la prova che il test di per nulla nella classe di test di unità MyClass e non nella classe di test dell'unità EntryPointClass?
Perché non ho un evento in MyClass per gestire gli errori e quando si verifica un errore sollevare l'evento? –
Jobs @Steve: questa è anche una possibile soluzione per mantenere le classi disaccoppiate, ma perché vuoi rendere le cose più complicate del necessario?Le eccezioni sono * il meccanismo standard * se gli errori non possono essere gestiti nel luogo in cui si verificano; costruire il proprio meccanismo di eventi è come reinventare la ruota. –
Se ad esempio si dispone di un elenco e si effettua un controllo per vedere se è vuoto. Vuoi fare un'eccezione o faresti un evento amichevole? –