将实际十进制值作为属性的参数(例如xUnit.net的[InlineData]

Tim*_*ann 9 c# decimal xunit.net

我正在尝试使用xUnit.net进行单元测试.我想用'[InlineData]'进行'理论'测试,其中包括'小数':

[Theory]
[InlineData(37.60M)]
public void MyDecimalTest(decimal number)
{
    Assert.Equal(number, 37.60M);
}
Run Code Online (Sandbox Code Playgroud)

这是不可能的,因为您不能将小数创建为常量.我找到了解决方法,把数引号 LIK如此__CODE__.这实际上会将其转换为双重,这将使测试失败.

问题:
有解决方法吗?如果不是,为我的测试创建多个测试用例的最简单方法是什么?

Dav*_*haw 16

您应该能够使用Attribute中的String值并将Parameter类型设置为Decimal,据我所知,它由测试框架自动转换.

[Theory]
[InlineData("37.60")]
public void MyDecimalTest(Decimal number)
{
    Assert.Equal(number, 37.60M);
}
Run Code Online (Sandbox Code Playgroud)

如果这不起作用,那么您可以通过传入String参数手动转换它.

[Theory]
[InlineData("37.60")]
public void MyDecimalTest(String number)
{
    var d = Convert.ToDecimal(number);
    Assert.Equal(d, 37.60M);
}
Run Code Online (Sandbox Code Playgroud)

  • 如果当前文化有可能使用不同的数字格式,请考虑“Convert.ToDecimal(number, NumberFormatInfo.InvariantInfo)”或等效的“Convert.ToDecimal(number, CultureInfo.InvariantCulture)”。否则这可能会显示为 3760(三千七百六十)。 (2认同)
  • 为了第一个代码片段,对我来说它不编译.`该值不能转换为'decimal'类型的方法参数'number' (2认同)

Sti*_*nin 11

而不是InlineData,使用MemberData这里所示。这为您设置多个测试提供了更大的灵活性,并允许使用小数或任何其他非常量类型。

public class CalculatorTests  
{

    public static IEnumerable<object[]> Data =>
        new List<object[]>
        {
            new object[] { 1.2M, 2.1M, 3.3M },
            new object[] { -4.000M, -6.123M, -10.123M }
        };

    [Theory]
    [MemberData(nameof(Data))]
    public void CanAddTheoryMemberDataProperty(decimal value1, decimal value2, decimal expected)
    {
        var calculator = new Calculator();

        var result = calculator.Add(value1, value2);

        Assert.Equal(expected, result);
    }
}
Run Code Online (Sandbox Code Playgroud)