当我使用[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");
}
在这种情况下,在测试资源管理器中没有创建“子条目”(您可以看到左侧的三角形不在那里):
**当使用复杂/自定义类型时,如何在测试资源管理器中获取子条目?**我需要它来调试一个“子条目”/一个测试,其中只有一个条目是通过动态数据提供的(在测试浏览器中右键单击“子条目”,选择“调试”,当然,当没有创建“子条目”时,这是不可能的)。
1条答案
按热度按时间8hhllhi21#
你必须像这样声明和初始化你的记录:
也就是说,不使用参数化的构造函数
new CustomRecord(...)
。我不清楚为什么扩展这样一个项目对测试资源管理器不起作用。该功能可能尚未完全开发,因为它是在VS 2022中引入的。更新
获取单个测试数据条目的另一种方法是在测试方法属性上使用 DynamicDataDisplayName:
这将产生与上面的图片所示相同的输出。当使用结构或类而不是记录时,这很方便,例如。当针对缺乏记录的.Net Framework时。