4

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.5251661

结果 StackTrace: at xxxxxx.d__10.MoveNext() in C:\Users\xxx\xxx\xxx.cs:line 101 --- 在 System.Runtime.CompilerServices 处从先前引发异常的位置结束堆栈跟踪.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 结果消息: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.Private.CoreLib.ni.dll 中的“System.DllNotFoundException”

附加信息:无法加载 DLL 'combase.dll':找不到指定的模块。(来自 HRESULT 的异常:0x8007007E)

4

1 回答 1

3

当我查看HttpException的类型层次结构时,我发现它不是从 InvalidOperationException 继承的。因此单元测试正确失败。

可能有一些 LINQ 代码或其他代码无法正确执行,因此会捕获 HttpException 并将其转换为 InvalidOperationException。

您应该能够调试单元测试。指示 Visual Studio 在出现异常时停止,然后逐步前进并尝试找出异常被转换的位置,例如,当您单步执行某些 LINQ 代码时。

MoveNext() 调用表明某些东西试图循环值。调试时,禁用Just my code,因为它可能在 .NET 框架中。

于 2017-02-23T19:55:06.713 回答