У меня есть метод расширения C#, который можно использовать с задачами, чтобы удостовериться, что выбрасываемые исключения были соблюдены как минимум, чтобы не сбой процесса хостинга. В .NET4.5 поведение немного изменилось, поэтому этого не произойдет, однако незаметное событие исключения все еще запущено. Моя задача здесь - написать тест, чтобы доказать, что метод расширения работает. Я использую NUnit Test Framework, а ReSharper - тестовый бегун.Тест для UnObserved Исключения
Я попытался:
var wasUnobservedException = false;
TaskScheduler.UnobservedTaskException += (s, args) => wasUnobservedException = true;
var res = TaskEx.Run(() =>
{
throw new NaiveTimeoutException();
return new DateTime?();
});
GC.Collect();
GC.WaitForPendingFinalizers();
Assert.IsTrue(wasUnobservedException);
Тест всегда терпит неудачу на Assert.IsTrue
. Когда я запускаю этот тест вручную, в чем-то вроде LINQPad, я получаю ожидаемое поведение wasUnobservedException
, возвращающееся как true
.
Я угадываю, что тестовая среда улавливает исключение и наблюдает за ней так, что TaskScheduler.UnobservedTaskException
никогда не запускается.
Я попытался изменить код следующим образом:
var wasUnobservedException = false;
TaskScheduler.UnobservedTaskException += (s, args) => wasUnobservedException = true;
var res = TaskEx.Run(async() =>
{
await TaskEx.Delay(5000).WithTimeout(1000).Wait();
return new DateTime?();
});
GC.Collect();
GC.WaitForPendingFinalizers();
Assert.IsTrue(wasUnobservedException);
попытку я сделал в этом коде был вызвать задачу, чтобы получить GC'd перед было брошено исключение, так что финализации увидят незатронутое исключение. Однако это привело к тому же отказу, описанному выше.
Действительно ли какой-либо обработчик исключений связан с тестовой платформой? Если да, есть ли способ обойти это? Или я просто полностью возился с чем-то, и есть лучший/более простой способ сделать это?
У меня не было возможности реализовать этот ответ и попробовать его, но он пока выглядит хорошо. –
Выглядит хорошо. Я согласен, ценность довольно сомнительна, но я не могу придумать другой способ доказать, что код работает. –
Это не работает для меня. Установлены NUnit 2.6.4 и .NET 4.6 и тестовый таргетинг на проект 4.5.1. Событие просто никогда не поднималось. Я пробовал много разных вариантов без успеха. – angularsen