我正在尝试使用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"
。这实际上会将其转换为双倍,这将使测试失败。
问题:
这有解决方法吗?如果不是,为我的测试创建多个测试用例的最简单方法是什么?
答案 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);
}
}