在DataRowAttribute中使用十进制值

Sam*_*Sam 22 c# unit-testing mstest visual-studio-2017

我已经使用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)
{
}
Run Code Online (Sandbox Code Playgroud)

当我尝试使用[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中使用十进制数?

pln*_*pln 10

这是因为decimal不是原始类型

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

  • 字符串也不是原始类型. (5认同)
  • 我选择使用双打。 (3认同)
  • 我传入双打,然后使用Convert.ToDecimal(double) (2认同)

noh*_*wnd 9

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

这是传递小数的示例:

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)