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

问题描述 投票:0回答:5

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

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

这是不可能的,因为您无法创建小数作为常量

问题:
有解决方法吗?

c# decimal xunit.net
5个回答
44
投票

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

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

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

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

27
投票

不要使用

InlineData
,而是使用
MemberData
,如此处所示。这使您在设置多个测试时具有更大的灵活性,并允许使用小数或任何其他非常量类型。

public class CalculatorTests  
{

    public static TheoryData<decimal, decimal, decimal> Data =>
        new()
        {
            { 1.2M, 2.1M, 3.3M },
            { -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);
    }
}

3
投票

NUnit 解决方案(Google 将我带到这里)接受的答案给了我一些想法,因此经过一些研究后,在 NUnit Sequential Attribute with arrays in Values 的帮助下想出了一些想法。表达式的名称是一个 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);
    }
}

2
投票

正如 @StillLearning 已经建议的那样,您可以使用

MemberData
属性。现在有 TheoryData<> 类型可以使您的输入类型安全。

我(目前)无法编辑该答案,因此我将其作为另一个答案发布。

public class CalculatorTests  
{

    public static TheoryData<decimal, decimal, decimal> Data =>
        new()
        {
            { 1.2M, 2.1M, 3.3M },
            { -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);
    }
}

0
投票

只需使用 double 或 int 值,它们将隐式转换为十进制

[Theory]
[InlineData(10,15.5)]
public void Test(decimal amountA, decimal amountB)
© www.soinside.com 2019 - 2024. All rights reserved.