【问题标题】:Test Exception with Theory in XUnit在 XUnit 中用理论测试异常
【发布时间】:2019-05-08 16:27:46
【问题描述】:

我使用 XUnit 进行了以下单元测试:

[Theory]
[InlineData(1, 2, 3)]
[InlineData(-2, 2, 0)]
[InlineData(int.MinValue, -1, int.MaxValue)]
public void CanAddTheory(int value1, int value2, int expected) {
  var calculator = new Calculator();
  var result = calculator.Add(value1, value2);
  Assert.Equal(expected, result);
}

public class Calculator {
  public int Add(int value1, int value2) {

    if (value1 == value2) 
      throw new ArgumentOutOfRangeException();

    return value1 + value2;

  }
}

是否可以使用理论并测试方法是否返回异常?

在此示例中,如果 value1 == value2: 会返回异常:

[InlineData(2, 2, Exception???)]

【问题讨论】:

  • 无论如何,我建议使用不同的测试来检查异常,您正在测试不同的东西。
  • 您是否尝试将此异常测试添加到现有理论中?您可以随时添加一个单独的 [Fact][Theory] 并使用不同的参数,并使用 Assert.Throws() 作为测试。
  • 如果您想测试所有导致相同异常的多个输入,我可以看到它是有意义的。但是将两者混合起来没有任何意义。
  • 我将为异常创建一个不同的测试。感谢您的意见。
  • 否,因为Inline 属性只接受常量值作为参数。例外不是。

标签: c# xunit


【解决方案1】:

http://dontcodetired.com/blog/post/Testing-for-Thrown-Exceptions-in-xUnitnet

[Theory]
[InlineData(1, 2, 3)]
[InlineData(-2, 2, 0)]
[InlineData(int.MinValue, -1, int.MaxValue)]
public void Calculator_CanAddValidValues(int value1, int value2, int expected) {
  var calculator = new Calculator();
  var result = calculator.Add(value1, value2);
  Assert.Equal(expected, result);
}

[Theory]
[InlineData(1, 1)]
[InlineData(2, 2)]
[InlineData(89, 89)]
public void Calculator_InValidValuesThrowArgumentOutOfRangeException(int value1, int value2) {
  var calculator = new Calculator();
  Assert.Throws<ArgumentOutOfRangeException>(() => calculator.Add(value1, value2);
}

public class Calculator {
  public int Add(int value1, int value2) {

    if (value1 == value2) 
      throw new ArgumentOutOfRangeException();

    return value1 + value2;

  }
}

【讨论】:

    【解决方案2】:

    我让它像这样工作..

    [Theory]
    [InlineData("", typeof(ArgumentException),"invalid name")]
    [InlineData(null, typeof(ArgumentNullException), "name cannot be null")]
    public void some_test(string name, Type exceptionType, string message){
      
      var project = new Project();
      
      try {
       project.updateName(name);
      } 
      catch (Exception e){
          Assert.True(e.GetType() == exceptionType);
          Assert.Equal(e.Message,message);
      }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-03
      • 1970-01-01
      • 2017-01-26
      • 1970-01-01
      • 1970-01-01
      • 2014-07-12
      • 2018-10-14
      • 1970-01-01
      相关资源
      最近更新 更多