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.Throwsasserzione 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 ArgumentExceptione 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 SetCultureAttributeper 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.