使用List <string>类型作为DataRow参数

时间:2018-11-08 00:34:18

标签: c# list unit-testing parameters attributes

我们如何在List<string>中将DataRow传递给[DataTestMethod]参数

我正在尝试类似的事情:

[DataTestMethod]
[DataRow(new List<string>() {"Iteam1"})]
[TestCategory(TestCategories.UnitTest)]
public void MyTest(IEnumerable<string> myStrings)
{
// ...    
}

我收到一个编译错误:

  

属性参数必须是常量表达式,typeof表达式   参数类型的数组或数组创建表达式

甚至可以像这样传递列表吗?

2 个答案:

答案 0 :(得分:2)

如错误消息所述,您不能在属性中使用List,但是可以使用数组。

[DataTestMethod]
[DataRow(new string[] { "Item1" })]
[TestCategory(TestCategories.UnitTest)]
public void MyTest(string[] myStrings)
{
    // ...  
}

要真正使用List或任何其他类型,可以使用DynamicDataAttribute

[DataTestMethod]
[DynamicData(nameof(GetTestData), DynamicDataSourceType.Method)]
[TestCategory(TestCategories.UnitTest)]
public void MyTest(IEnumerable<string> myStrings)
{
    // ...  
}

public static IEnumerable<object[]> GetTestData()
{
    yield return new object[] { new List<string>() { "Item1" } };
}

赋予DynamicDataAttribute的方法或属性必须返回IEnumerable对象数组。这些对象数组表示要传递给测试方法的参数。

如果列表中始终有固定数量的项目,则可以避免完全使用列表

[DataTestMethod]
[DataRow("Item1", "Item2")]
[TestCategory(TestCategories.UnitTest)]
public void MyTest(string string1, string string2)
{
    // ...  
}

答案 1 :(得分:0)

我发现了另一种很酷的方法来处理数组! :)

MS测试中的DataRow允许您传递params参数。这些将传递到测试方法签名中的数组。

    [TestMethod]
    [DataRow(true, "")]
    [DataRow(true, "", "")]
    [DataRow(true, "", "", "0")]
    [DataRow(true, "", "", "", "1")]
    [DataRow(true, "", "1", "", "0", "")]
    [DataRow(false, "1")]
    [DataRow(false, "", "1")]
    [DataRow(false, "", "", "1")]
    [DataRow(false, "", "", "1", "1")]
    [DataRow(false, "1", "1", "1", "1")]
    public void IsSparseRow(bool expected, params string[] row)
    {
        // Arrange

        // Act
        var actual = ExcelFileHelpers.IsSparseRow(row);

        // Assert
        Assert.AreEqual(expected, actual);
    }