将实际的十进制值作为属性的参数(例如 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);
}
}
我正在尝试使用 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);
}
}