Using List<string> type as DataRow Parameter

Viewed 11199

How can we pass a List<string> to a DataRow parameter in [DataTestMethod]

I am trying something like:

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

I am getting a compile error:

An attribute argument must be a constant expression, typeof expression or array creation expression of an attribute parameter type

Is it even possible to pass List like this?

2 Answers

As the error message mentions, you cannot use Lists in attributes but you can use arrays.

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

To really use a List or any other type you can use 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" } };
}

The method or property given to the DynamicDataAttribute must return an IEnumerable of object arrays. These object arrays represent the parameters to be passed to your test method.

If you always have a fixed number of items in your list you can avoid using lists altogether

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

I found another cool way to do it with arrays! :)

The DataRow in MS Test allows you to pass params parameters. These will pass into the array in the test method signature.

    [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);
    }
Related