【问题标题】:c# Xunit, Assert.Throws fails when expected exception raisedc# Xunit, Assert.Throws 在引发预期异常时失败
【发布时间】:2016-03-22 17:41:11
【问题描述】:

编辑: 有一个类似的问题here,但解决方案仅提供解决方法,并没有提供有关问题原因或解决方法的见解。这个问题可能仍然是重复的。

编辑 2: 事实证明,此问题在调试期间发生,尽管之前并未发生。将(TCheck)null 替换为null as TCheck 后,测试在运行时通过,但在调试时抛出异常。

原帖: 我在单元测试中有一个方法,看起来像这样

internal void EqualityAssert<TCheck, TEquatable>(TEquatable item, ... ) 
    where TCheck : class, IEquatable<TEquatable>, TEquatable
{

    // Various equality assertions that are passing
    // ...

    // A == null       
    Assert.Throws<NullReferenceException>(
    () => ((IEquatable<TEquatable>)item).Equals((TCheck)null));            
}

这个方法被各种单元测试调用,并且这些测试中的每一个都失败了,因为“遇到了未处理的 NullReferenceException”,这正是预期的地方。

Assert.Throws 之前对我来说可以正常工作,但我无法弄清楚是什么改变了它。

【问题讨论】:

  • 可能是因为(TCheck)null。尝试将其更改为 null as TCheck。我刚刚试了一下,看起来不太可能,但很高兴看看你的场景会发生什么。
  • 你试过调试你的测试吗?
  • @StephenRoss 这并没有解决问题,我仍然在 Equals 实现中遇到异常,这正是预期的。
  • @rclocher3 也许我误解了你的问题..是的,我正在逐步完成测试并检查值,一切都符合预期。您问的是更具体的调试方法吗?
  • 不,我只是记得有一次我的测试失败了,因为我认为这是意料之中的未捕获异常,但事实证明在代码的其他地方抛出了异常。祝你好运。

标签: c# unit-testing nullreferenceexception assert xunit.net


【解决方案1】:

最好使用这种模式:

[Fact]
public void Divide_TwoNumbers_ExpectException()
{
    var sut = new Calculator();
    var exception = Record.Exception(() => sut.Divide(10, 0));
    Assert.IsType(typeof(DivideByZeroException), exception);
}

【讨论】:

  • 为什么更好? (不是说不是,但它会改善这个答案)
  • 对于异步方法使用:Record.Exception(()=&gt;GetSomeAsync().GetAwaiter().GetResult());,
  • 这个答案是richard-banks.org/2015/07/…的复制和粘贴。您应该将其链接为来源。
  • xUnit Assert 建议您使用 Assert.IsType&lt;T&gt;(exception) 而不是使用 typeof() 表达式。
【解决方案2】:

你抛出异常但你应该处理它。检查下面的代码。您可以根据我的示例修改您的代码。

var message = FakeRequestBuilder.CreateSettlementFileMessage();

var warning = Assert.Throws<ExF.Core.Exception.IntegrationValidationException>(
                () => createSettlementFileHandler.Handle(message));

Assert.Equal(warning.ErrorCode, -1);

【讨论】:

    猜你喜欢
    • 2016-09-20
    • 1970-01-01
    • 2019-02-26
    • 1970-01-01
    • 1970-01-01
    • 2022-01-04
    • 2011-01-14
    • 1970-01-01
    • 2023-02-12
    相关资源
    最近更新 更多