Assert.Throws
restituisce l'eccezione generata che consente di affermare l'eccezione.
var ex = Assert.Throws<Exception>(() => user.MakeUserActive());
Assert.That(ex.Message, Is.EqualTo("Actual exception message"));
Pertanto, se non viene generata alcuna eccezione o viene generata un'eccezione di tipo errato, la prima Assert.Throws
asserzione fallirà. Tuttavia, se viene generata un'eccezione del tipo corretto, ora puoi affermare l'eccezione effettiva che hai salvato nella variabile.
Utilizzando questo modello è possibile affermare altre cose oltre al messaggio di eccezione, ad esempio nel caso di ArgumentException
e derivati, è possibile affermare che il nome del parametro è corretto:
var ex = Assert.Throws<ArgumentNullException>(() => foo.Bar(null));
Assert.That(ex.ParamName, Is.EqualTo("bar"));
Puoi anche usare l'API fluente per fare questi assert:
Assert.That(() => foo.Bar(null),
Throws.Exception
.TypeOf<ArgumentNullException>()
.With.Property("ParamName")
.EqualTo("bar"));
o in alternativa
Assert.That(
Assert.Throws<ArgumentNullException>(() =>
foo.Bar(null)
.ParamName,
Is.EqualTo("bar"));
Un piccolo suggerimento quando si asserisce sui messaggi di eccezione è quello di decorare il metodo di test con SetCultureAttribute
per assicurarsi che il messaggio generato stia utilizzando la cultura prevista. Questo entra in gioco se si memorizzano i messaggi di eccezione come risorse per consentire la localizzazione.