Тест 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.

Другие вопросы по тегам