Сейчас я работаю над проектом, в котором мне нужно взаимодействовать с кодом, который проглатывает исключения. В частности, я пишу модульные тесты NUnit. В некоторых местах я хочу встроить утверждения в код, который передается как делегат, как часть насмешки над определенным поведением. У меня проблема в том, что AssertionException проглатывается кодом, вызывающим делегат, что означает, что тест пройден, даже если тест Assert не выполнен.
Есть ли способ сообщить NUnit о том, что должен произойти сбой теста, который нельзя обойти, перехватив AssertionException? Я не могу изменить код, который поглощает исключения, поскольку у меня нет полной собственности, и он уже находится в полупроизводственном использовании. Я надеюсь, что есть чистый способ сделать это.
Лучшее, что я придумал, примерно так:
private static string _assertionFailure;
public static void AssertWrapper(Action action)
{
try
{
action();
}
catch (AssertionException ex)
{
_assertionFailure = ex.Message;
throw;
}
}
[Test]
[ExpectedException(typeof(AssertionException))]
public void TestDefeatSwallowing()
{
Action failure = () => AssertWrapper(() => Assert.Fail("This is a failure"));
EvilSwallowingMethod(failure);
if (_assertionFailure != null)
Assert.Fail(_assertionFailure);
}
private void EvilSwallowingMethod(Action action)
{
try
{
action();
}
catch
{
}
}
Это работает, но довольно уродливо. Я должен обернуть каждый вызов Assert и в конце каждого теста должен проверить, было ли утверждение проглочено.