在 DataRowAttribute 中使用十进制值

问题描述 投票:0回答:2

我有一个用于测试的 C# 程序集,可以使用 MSTest.TestAdaptor 1.1.17 在 Visual Studio 2017 中运行。 我想使用 DataTestMethod 对多个数据集运行测试。我的问题是,我想在 DataRows 中使用十进制值,但不能:

[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 中使用十进制数字?

c# unit-testing mstest visual-studio-2017
2个回答
29
投票

这是因为十进制不是原始类型

解决方案是使用字符串,然后在测试中转换参数。

评论更新:双精度转换比字符串转换更简单

(decimal)doubleTotal


9
投票
这是 C# 的限制,而不仅仅是测试框架的限制。您还可以使用 DynamicData 属性来查询数据的静态属性或方法。你让它输出对象数组的数组。即每个“数据行”一项,以及您希望提供的每个参数一项。您也不限于传递原始类型,您可以将任意对象传递给参数。这是一个很好的例子

https://stackoverflow.com/a/47791172.

这是传递小数的示例:

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); } } }
    
© www.soinside.com 2019 - 2024. All rights reserved.