如何提供两个数组作为 DataRow 参数?

How to supply two arrays as DataRow parameters?

我正在尝试编写一个单元测试来比较两个数组。我这样定义单元测试:

[DataTestMethod]
[DataRow(
    new[] { "COM3", "COM1", "COM2" },
    new[] { "COM1", "COM2", "COM3" }
)]
...
public void TestCOMPortSorting(string[] unorderedPorts, string[] expectedOrderedPorts)

但是,我的 IDE 抛出以下错误:

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

我试过使用外部变量,将数组定义为 new string[],用这些数组创建一个数组,但都没有成功。

如何将这两个数组用作单元测试的参数?

对于如此复杂的数据,改为使用 DynamicData 属性

This attribute allows to get the values of the parameters from a method or a property. The method or the property must return an IEnumerable<object[]>. Each row corresponds to the values of a test.

[DataTestMethod]
[DynamicData(nameof(TestDataMethod), DynamicDataSourceType.Method)]
public void TestCOMPortSorting(string[] unorderedPorts, string[] expectedOrderedPorts) {
    //...
}

static IEnumerable<object[]> TestDataMethod() {
    return new[] {
        new []{ new[] { "COM3", "COM1", "COM2" }, new[] { "COM1", "COM2", "COM3" } } //a data row
    };
}

引用MSTest v2: Data tests

DataRowAttribute 可以处理简单类型的数组。这里的问题是 DataRowAttribute 对多个参数有以下重载:DataRowAttribute(object data1, params object[] moreData).

在你的表达中,我认为 C# 将第二个字符串数组作为 object[] moreData 而它不喜欢它。如果您明确指定 params object[] 参数,它将按预期采用第二个字符串数组。

[DataTestMethod]
[DataRow(
    new[] { "COM3", "COM1", "COM2" },
    new object[] { new[] { "COM1", "COM2", "COM3" } }
)]
...
public void TestCOMPortSorting(string[] unorderedPorts, string[] expectedOrderedPorts)

请注意,如果您有任何其他第三个参数,它可以在没有解决方法的情况下工作。