c#Xunit,Assert.Throws在引发预期的异常时失败

时间:2016-03-22 17:41:11

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

编辑:还有一个类似的问题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我之前的工作正常,但我无法弄清楚改变了什么来打破它。

2 个答案:

答案 0 :(得分:5)

最好使用这种模式:

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

答案 1 :(得分:0)

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

var message = FakeRequestBuilder.CreateSettlementFileMessage();

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

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