我正在尝试使用 xUnit.net 进行单元测试。我想要使用“[InlineData]”进行“理论”测试,其中包括“小数”:
[Theory]
[InlineData(37.60M)]
public void MyDecimalTest(decimal number)
{
Assert.Equal(number, 37.60M);
}
这是不可能的,因为您无法创建小数作为常量。
问题:
有解决方法吗?
您应该能够在属性中使用字符串值并将参数类型设置为十进制,据我所知,它会由测试框架自动转换。
[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);
}
不要使用
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);
}
}
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);
}
}
正如 @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);
}
}
只需使用 double 或 int 值,它们将隐式转换为十进制
[Theory]
[InlineData(10,15.5)]
public void Test(decimal amountA, decimal amountB)