【问题标题】:Assert.ThrowsException test fails when it does throw exceptionAssert.ThrowsException 测试在抛出异常时失败
【发布时间】:2017-02-23 19:31:27
【问题描述】:

我正在使用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));
}

当我调试它时,在它出错和失败之前运行的最后一行代码是这样的:

异常 exsystem.invalidOperationException 但这无关紧要,因为无论如何它都会抛出 HttpException。测试失败的原因:

测试名称:ShouldThrowHttpExceptionIfPassedObjectIsNull 测试 全名:xxx.xxx.xxx.xxx.ShouldThrowHttpExceptionIfPassedObjectIsNull 测试 来源:C:\Users\xxx\xxx.cs :第 88 行测试结果:失败测试持续时间:0:04:35.5251661

结果堆栈跟踪:在 xxxxxx.d__10.MoveNext() 在 C:\Users\xxx\xxx\xxx.cs:line 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)

【问题讨论】:

  • @ThomasWeller 否,但测试正在测试 HttpException,这是抛出的异常。

标签: c# unit-testing visualstudio.testtools


【解决方案1】:

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

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

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

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

【讨论】:

  • 但是当我从上图中的那行代码一步步往前走的时候,就在那行代码之后就崩溃了。
  • 好吧,忽略我最后的评论。现在就这样做。谢谢
  • 您的答案就是解决方案。谢谢!。我只是想知道您是否可以就我的发现指出正确的方向(请参阅问题底部的编辑)。这很奇怪,因为它第一次成功抛出了 HttpException,尽管它只有 2 个参数,而最后一个参数是 3 个。也许被测代码需要更改?
  • A DllNotFoundException 又是不同的东西。可以继续调试吗? DllNotFoundException 是否又被其他东西捕获了?
  • 忽略我最后的评论。我忘记了 _logger 被嘲笑了。我只需要继续独自工作,因为您可以从互联网上获得所有帮助。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-21
  • 2013-09-08
  • 2014-04-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多