Существует шаблон , который я опубликовал в прошлом , чтобы проверить дополнительные ожидания, когда должно быть повышено исключение.
Похоже, вы пытаетесь уменьшить "Код Boilerplate", чтобыя создал следующий вспомогательный класс:
public static class ExceptionAssert
{
/// <summary>
/// Use this method if your UT is using <see cref="ExpectedExceptionAttribute"/> and you want to verify additional expectations
/// </summary>
/// <typeparam name="T">The expected exception type base</typeparam>
/// <param name="action">Execute the unit to test</param>
/// <param name="verifier">Verify the additional expectations</param>
public static void AssertException<T>(Action action, Action<T> verifier) where T: Exception
{
try
{
action();
}
catch(T e)
{
verifier(e);
throw;
}
}
/// <summary>
/// Use this method if your UT is not using <see cref="ExpectedExceptionAttribute"/> and you want to verify additional expectations
/// </summary>
/// <typeparam name="T">The expected exception type base</typeparam>
/// <param name="action">Execute the unit to test</param>
/// <param name="verifier">Verify the additional expectations</param>
/// <param name="allowDriven">Indicates if the raised exception can be an instance of driven class</param>
public static void AssertExceptionWithoutExcepctedExceptionAttribute<T>(Action action, Action<T> verifier, bool allowDriven = true) where T : Exception
{
try
{
action();
Assert.Fail("No Exception raised");
}
catch (T e)
{
if (!allowDriven && e.GetType() != typeof(T))
{
Assert.Fail($"The raised exception :: {e.GetType()} is a driven instance of :: {typeof(T)}");
}
verifier(e);
}
}
}
Теперь вы можете выполнить свой UT как один из следующих:
[TestMethod]
[ExpectedException(typeof(Exception), AllowDerivedTypes = true)] // change the attribute settings
public void Foo()
{
// do arrange:
ExceptionAssert.AssertException<Exception>(() => // change "Exception" to the required exception type or left it as any exception
{
// do the act:
}, exception =>
{
// do you asserts statements:
});
}
[TestMethod]
public void FooBar()
{
// do arrange:
ExceptionAssert.AssertExceptionWithoutExcepctedExceptionAttribute<Exception>(() => // change "Exception" to the required exception type or left it as any exception
{
// do the act:
}, exception =>
{
// do you asserts statements:
}, false);
}
Кстати, ИМО, вы никогда не должны проверять само исключение, кроме еготип / ведомый (или, если это пользовательское исключение с дополнительной информацией), так как ваш код никогда не должен зависеть от его MSG, стека вызовов и т. д. ... Я думаю, что это причина, по которой MS не добавил к ExpectedExceptionAttribute возможность проверки MSG.