【问题标题】:How to supply two arrays as DataRow parameters?如何提供两个数组作为 DataRow 参数?
【发布时间】:2019-08-22 12:08:44
【问题描述】:

我正在尝试编写一个单元测试来比较两个数组。我已经将单元测试定义为:

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

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

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

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

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

【问题讨论】:

  • 您需要向表中添加行 dt.Rows.Add(new[] { "COM3", "COM1", "COM2" });
  • 我现在面临这个问题,如果我添加任何第三个参数,我可以看到一切正常。一个阵列也可以正常工作。我认为这是因为 DataRow 的 'param's 重载无法破译两个数组,但我不知道如何告诉编译器这个......

标签: c# unit-testing mstest


【解决方案1】:

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

此属性允许从方法或属性中获取参数的值。方法或属性必须返回IEnumerable<object[]>。每行对应一个测试的值。

[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

【讨论】:

  • 我怎么不知道这个神奇的DynamicDataAttribute??? ??
【解决方案2】:

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)

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

【讨论】:

    猜你喜欢
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 2017-11-29
    • 2020-11-06
    • 2019-12-22
    • 1970-01-01
    • 2010-09-06
    • 1970-01-01
    相关资源
    最近更新 更多