Тест Assert.ThrowsException не выполняется, когда он выдает исключение
Я использую Microsoft.VisualStudio.TestTools.UnitTesting
для модульного тестирования.
У меня есть этот тест, который утверждает, что было сгенерировано исключение, и оно терпит неудачу
[TestMethod]
public async Task ShouldThrowHttpExceptionIfPassedObjectIsNull()
{
_mockLogger = new Mock<ILogger<DataService>>();
// setup memoryCache
object expected = null;
_mockNullMemoryCache = MockMemoryCacheService.GetNullMemoryCache(expected);
_mockSessionManagementService = new MockSessionManagementService();
_ds = new DataService(
_mockLogger.Object,
_mockNullMemoryCache.Object,
_mockSessionManagementService
);
Assert.ThrowsException<HttpException>(() => _ds.RetrieveFileData<object>(_incorrectFilePath, false));
}
Когда я отлаживаю его, последняя строка кода, которая запускается до того, как произойдет ошибка и произойдет сбой, выглядит так:
Исключение ex
это system.invalidOperationException
но это не должно иметь значения, потому что он генерирует исключение HttpException, несмотря ни на что. Почему тест не проходит по причине:
Имя теста: ShouldThrowHttpExceptionIfPassedObjectIsNull Полное имя теста: xxx.xxx.xxx.xxx.ShouldThrowHttpExceptionIfPassedObjectIsNull Источник теста: C:\Users\xxx\xxx.cs: строка 88 Результат теста: Длительность теста не пройдена: 0:04:35.5
Результат StackTrace: at xxxxxx.d__10.MoveNext() в C:\Users\xxx\xxx\xxx.cs: строка 101 --- Конец трассировки стека из предыдущего расположения, где было сгенерировано исключение --- в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Задача задачи) в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Задача задачи) Сообщение об ошибке: Ошибка Assert.ThrowsException. Не исключение брошено. HttpException исключение ожидалось.
РЕДАКТИРОВАТЬ Код затем перемещается в этот блок кода после изображения:
else
{
// Parsing issue
_logger.LogError(string.Format("Id={0}, Could not retrieve data from {1} : Malformed source data", _sessionManagementService.SessionId, url));
throw new HttpException(HttpStatusCode.InternalServerError, "Malformed source data", true);
}
Так как он генерирует исключение HttpException выше, он генерирует исключение DllNotFoundException.
Возникло исключение: System.DllNotFoundException в System.Private.CoreLib.ni.dll
Дополнительная информация: Невозможно загрузить DLL 'combase.dll': указанный модуль не найден. (Исключение из HRESULT: 0x8007007E)
1 ответ
Когда я смотрю на иерархию типов HttpException, я вижу, что он не наследуется от InvalidOperationException. Поэтому модульный тест не проходит правильно.
Вероятно, есть некоторый код LINQ или другой код, который не может выполняться правильно, поэтому перехватывает HttpException и преобразует его в InvalidOperationException.
Вы должны быть в состоянии отладить юнит-тест. Проинструктируйте Visual Studio останавливаться на исключениях, затем пошагово продвигайтесь вперед и попытайтесь выяснить, где преобразуется ваше исключение, например, когда вы перебираете некоторый код LINQ.
Вызов MoveNext() указывает, что что-то пытается перебрать значения. При отладке отключите Just my code, потому что он может быть в.NET Framework.