Visual Studio 当使用具有复杂类型的DynamicData时,TestExplorer缺少单个测试数据条目

z9smfwbn  于 2023-10-23  发布在  其他
关注(0)|答案(1)|浏览(78)

当我使用[DynamicData]属性来提供一个原始值的枚举时,例如:int,则Visual Studio测试资源管理器将为通过动态数据提供的每个值显示一个测试:

public static IEnumerable<object[]> PrimitiveTestData
{
    get
    {
        yield return new object[] {1};
        yield return new object[] {2};
        yield return new object[] {3};
    }
}

[TestMethod]
[DynamicData(nameof(PrimitiveTestData))]
public void TestWithPrimitiveTestData(int value)
{
    Console.WriteLine($"value is {value}");
}

来自测试资源管理器的屏幕截图,请注意如何创建3个“子条目”,每个子条目对应于通过动态数据提供的每个值:

但是,当通过[DynamicData]属性提供复杂/自定义类型时,不会创建“子条目”:

public record CustomRecord(
    decimal Number, 
    string Comment
);

public static IEnumerable<object[]> RecordTestData
{
    get
    {
        yield return new object[] {
            new CustomRecord(1m, "first")
        };

        yield return new object[] {
            new CustomRecord(2m, "second")

        };

        yield return new object[] {
            new CustomRecord(3m, "third")
        };
    }
}

[TestMethod]
[DynamicData(nameof(RecordTestData))]
public void TestWithRecordTestData(CustomRecord item)
{
    Console.WriteLine($"item number is {item.Number} entries");
}

在这种情况下,在测试资源管理器中没有创建“子条目”(您可以看到左侧的三角形不在那里):

**当使用复杂/自定义类型时,如何在测试资源管理器中获取子条目?**我需要它来调试一个“子条目”/一个测试,其中只有一个条目是通过动态数据提供的(在测试浏览器中右键单击“子条目”,选择“调试”,当然,当没有创建“子条目”时,这是不可能的)。

8hhllhi2

8hhllhi21#

你必须像这样声明和初始化你的记录:

public record CustomRecord
{
    public decimal Number;
    public string Comment = "";
}

public static IEnumerable<object[]> RecordTestData
{
    get
    {
        yield return new object[] {
            new CustomRecord { Number = 1m, Comment = "first" }
        };

        yield return new object[] {
            new CustomRecord { Number = 2m, Comment = "second" }
        };

        yield return new object[] {
            new CustomRecord { Number = 3m, Comment = "third" }
        };
    }
}

也就是说,不使用参数化的构造函数new CustomRecord(...)。我不清楚为什么扩展这样一个项目对测试资源管理器不起作用。该功能可能尚未完全开发,因为它是在VS 2022中引入的。

更新

获取单个测试数据条目的另一种方法是在测试方法属性上使用 DynamicDataDisplayName

public static string GetTestDisplayName(MethodInfo methodInfo, object[] values)
{
    var item = (CustomRecord)values[0];
    return $"{methodInfo.Name}(Number = {item.Number}, Comment = {item.Comment})";
}

[TestMethod]
[DynamicData(nameof(RecordTestData), DynamicDataSourceType.Property, 
             DynamicDataDisplayName = nameof(GetTestDisplayName))]
public void TestWithRecordTestData(CustomRecord item)
{
    Console.WriteLine($"item number is {item.Number} entries");
}

这将产生与上面的图片所示相同的输出。当使用结构或类而不是记录时,这很方便,例如。当针对缺乏记录的.Net Framework时。

相关问题