C# : Syntaxe alternative pour les tests d'exception

AJA qu’il existait une alternative pour tester les exceptions en C#. Depuis toujours j’utilisais la syntaxe suivante :

1
2
3
4
5
6
7
8
[TestMethod]
[ExpectedException(typeof(DivideByZeroException))]
public void Division_ShouldThrowIfDividedByZero()
{
var a = 1;
var b = 0;
var c = a / b;
}

Cette syntaxe est assez limitée car elle ne permet pas d’effectuer d’assertions sur l’exception levée pendant l’exécution du test.

Certes, on peut insérer un bloc try/catch et effectuer des assertions comme ceci:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[TestMethod]
[ExpectedException(typeof(DivideByZeroException))]
public void Division_ShouldThrowIfDividedByZero()
{
try
{
var a = 1;
var b = 0;
var c = a / b;
}
catch(Exception e)
{
Assert.AreEqual("Attempted to divide by zero.", e.Message);
throw; // throw nécéssaire pour que le décorateur Expected soit honoré
}
}

Mais ce n’est pas très élégant 😢.

Or il existe une autre syntaxe bien plus pratique :

1
2
3
4
5
6
7
8
9
10
11
[TestMethod]
public void Division_ShouldThrowIfDividedByZero()
{
var ex = Assert.ThrowsException<DivideByZeroException>(() =>
{
var a = 1;
var b = 0;
var c = a / b;
});
Assert.AreEqual("Attempted to divide by zero.", ex.Message);
}

La lisibilité des tests est améliorée, les code reviews sont plus sereines et le monde se porte mieux. 🌈