在 DataRowAttribute 中使用十进制值
Using decimal values in DataRowAttribute
我有一个 c# 程序集用于 运行 在 Visual Studio 2017 中使用 MSTest.TestAdaptor 1.1.17 进行的测试。
我想使用 DataTestMethod 运行 对多个数据集进行测试。我的问题是,我想在我的数据行中使用十进制值,但不能:
[DataTestMethod]
[DataRow(1m, 2m, 3m)]
[DataRow(1, 2, 3)]
[DataRow(1.0, 2.0, 3.0)]
public void CheckIt(decimal num1, decimal num2, decimal expected)
{
}
当我尝试使用 [DataRow(100m, 7m, 7m)]
时,它甚至不会编译源代码:error CS0182: An attribute argument must be a constant expression, typeof expression or array creation expression of an attribute parameter type.
.
当我使用 [DataRow(100, 7, 7)]
时,测试将失败,因为我的测试期望 decimal
但得到 int32
作为值。
当我使用 [DataRow(100.0, 7.0, 7.0)]
时,测试将失败,因为我的测试期望 decimal
但得到 double
作为值。
为什么我不能在 DataRow 中使用十进制数?
因为小数不是primitive type
解决方案是使用字符串,然后在测试中转换参数。
这是 C# 的限制,而不仅仅是测试框架的限制。您还可以使用将查询静态 属性 或数据方法的 DynamicData 属性。你让它输出对象数组的数组。那是每个“数据行”的一个项目,以及您希望提供的每个参数的一个项目。您也不限于传递原始类型,您可以将任意对象传递给您的参数。这是 .
的一个很好的例子
下面是一个传递小数的例子:
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.Collections.Generic;
namespace UnitTestProject1
{
[TestClass]
public class UnitTest1
{
// static!
public static IEnumerable<object[]> TestMethod1Data =>
// one item per data row
new[] {
// one item per parameter, you need to specify the object type
new object[] { 1m, 2m, 3m },
new object[] { 13.5m, 178.8m, 192.3m }
};
[TestMethod]
// you can also use a method, but it defaults to property
[DynamicData(nameof(TestMethod1Data))]
public void TestMethod1(decimal l, decimal r, decimal expected)
{
Assert.AreEqual(expected, l + r);
}
}
}
我有一个 c# 程序集用于 运行 在 Visual Studio 2017 中使用 MSTest.TestAdaptor 1.1.17 进行的测试。 我想使用 DataTestMethod 运行 对多个数据集进行测试。我的问题是,我想在我的数据行中使用十进制值,但不能:
[DataTestMethod]
[DataRow(1m, 2m, 3m)]
[DataRow(1, 2, 3)]
[DataRow(1.0, 2.0, 3.0)]
public void CheckIt(decimal num1, decimal num2, decimal expected)
{
}
当我尝试使用 [DataRow(100m, 7m, 7m)]
时,它甚至不会编译源代码:error CS0182: An attribute argument must be a constant expression, typeof expression or array creation expression of an attribute parameter type.
.
当我使用 [DataRow(100, 7, 7)]
时,测试将失败,因为我的测试期望 decimal
但得到 int32
作为值。
当我使用 [DataRow(100.0, 7.0, 7.0)]
时,测试将失败,因为我的测试期望 decimal
但得到 double
作为值。
为什么我不能在 DataRow 中使用十进制数?
因为小数不是primitive type
解决方案是使用字符串,然后在测试中转换参数。
这是 C# 的限制,而不仅仅是测试框架的限制。您还可以使用将查询静态 属性 或数据方法的 DynamicData 属性。你让它输出对象数组的数组。那是每个“数据行”的一个项目,以及您希望提供的每个参数的一个项目。您也不限于传递原始类型,您可以将任意对象传递给您的参数。这是
下面是一个传递小数的例子:
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.Collections.Generic;
namespace UnitTestProject1
{
[TestClass]
public class UnitTest1
{
// static!
public static IEnumerable<object[]> TestMethod1Data =>
// one item per data row
new[] {
// one item per parameter, you need to specify the object type
new object[] { 1m, 2m, 3m },
new object[] { 13.5m, 178.8m, 192.3m }
};
[TestMethod]
// you can also use a method, but it defaults to property
[DynamicData(nameof(TestMethod1Data))]
public void TestMethod1(decimal l, decimal r, decimal expected)
{
Assert.AreEqual(expected, l + r);
}
}
}