(W przeciwieństwie do odpowiedzi Mcottle'a) Długa odpowiedź: NIE ... przez większość czasu
Kiedy powiesz, że spodziewasz się, że test zgłosi określony wyjątek, będziesz wiedział, kiedy DOWOLNA linia w tym teście zgłosi ten wyjątek.
To nie całkiem to samo, co wiedząc, że testowana metoda zgłasza wyjątek.
Jeśli Twój test obejmuje ustawienie obiektu lub kontekstu (w ramach testu, a nie w twojej wersji frameworka SetUp
), lepiej opuść pojedynczą linię, którą faktycznie chcesz przetestować w try / catch, być może z pomocą pomocnika.
Na przykład,
public static class AssertHelper {
public delegate void Thunk();
public static void DoesNotThrow<T>(Thunk thunk, string message = "")
where T: Exception {
try {
thunk.Invoke();
} catch(T) {
Assert.Fail(message);
}
}
}
i wtedy
[TestMethod]
public void assertHelperInAction() {
// Random setup stuff here that's too annoying to put in my SetUp
// method.
AssertHelper.DoesNotThrow<IllegalArgumentException>(() =>
{/* My random method under test */})
}
Jeśli ten test się nie powiedzie, wiem, że moja testowana metoda zgłosiła wyjątek, a nie coś w przypadkowej konfiguracji.
(Powinieneś unikać losowych ustawień instalacyjnych. Czasami łatwiej jest mieć jakiś kod instalacyjny w teście).