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

时间:2016-06-16 08:49:45

标签: c# decimal xunit.net

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

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

这是不可能的,因为您无法创建decimal as a constant。我找到了put the number in quotes的解决方法"37.60"。这实际上会将其转换为双倍,这将使测试失败。

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

3 个答案:

答案 0 :(得分:10)

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

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

答案 1 :(得分:2)

而不是SELECT id FROM employee WHERE name = 'Owner' ,请使用InlineData,如图所示here。这为您设置多个测试提供了更大的灵活性,并允许使用小数或任何其他非常量类型。

MemberData

答案 2 :(得分:1)

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