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

Having an actual decimal value as parameter for an attribute (example xUnit.net's [InlineData]

我正在尝试使用 xUnit.net 进行单元测试。我想要使​​用“[InlineData]”进行 'Theory' 测试,其中包括 'decimals':

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

这是不可能的,因为您无法创建 decimal as a constant

问题:
有解决办法吗?

您应该能够在属性中使用字符串值并将参数类型设置为十进制,据我所知,它会由测试框架自动转换。

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

如果这不起作用,那么您可以通过传入一个字符串参数来手动转换它。

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

而不是 InlineData,使用 MemberData,如图 here。这使您可以更灵活地设置多个测试,并允许使用小数或任何其他非常量类型。

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);
    }
}

NUnit 解决方案(Google 让我来到这里)接受的答案给了我一些想法,所以在 NUnit Sequential Attribute with arrays in Values 的帮助下进行了一些研究之后。 nameof 表达式是一个 c# 7 表达式

[TestFixture]
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 }
        };

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

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

        Assert.AreEqual(expected, result);
    }
}