使用 MSTest 的 C# 单元测试 DynamicDataDisplayName
C# Unit Test DynamicDataDisplayName using MSTest
我正在使用 MSTest 执行一些单元测试,我了解到我可以使用 [DynamicData]
属性输入不同的案例进行测试,但我不能使用属性 属性:DynamicDataDisplayName
为不同的案例设置名称。
我的测试代码是:
[TestMethod]
[DynamicData(nameof(TestInputs_BeReady), DynamicDataSourceType.Method,
DynamicDataDisplayName = nameof(GetTestDisplayNames),
DynamicDataDisplayNameDeclaringType = typeof(List<string>))]
public void Should_BeReady(object expValue, object[] inputs)
{
// Arrange
// Act
ui.InputID = (string)inputs[0];
ui.InputName = (string)inputs[1];
ui.InputList = (List<string>)inputs[2];
// Assert
Assert.AreEqual(expValue, onReadyStateChangeArgs.Ready);
}
public static IEnumerable<object[]> TestInputs_BeReady()
{
return new[]
{
new object[] { true, new object[] { "UTSZ0", "Unit Test Size List" , new List<string> { "entry_01", "entry_02" } } },
new object[] { false, new object[] { "STEST", "Unit Test Size List" , new List<string> { "entry_01", "entry_02" } } },
new object[] { false, new object[] { "", "Unit Test Size List" , new List<string> { "entry_01", "entry_02" } } },
new object[] { false, new object[] { "UTSZ0", "" , new List<string> { "entry_01", "entry_02" } } },
new object[] { false, new object[] { "UTSZ0", "Unit Test Size List", new List<string>() } },
new object[] { false, new object[] { "UTSZ0", "Unit Test Size List", null } }
};
}
public static IEnumerable<string> GetTestDisplayNames() => new List<string> {
"All Valid", "Duplicate ID", "Missing ID", "Missing Name", "Empty List", "Null List"
};
我在测试资源管理器结果中收到此消息:
Message: Value cannot be null.
Parameter name: Method GetTestDisplayNames
我在网上搜索了如何使用 DynamicDataDisplayName
但我无法提供一些东西;我发现的只是如何使用 DynamicData
编辑
感谢
,我使用此代码为测试输入添加了自定义名称
Matěj Pokorný
[TestMethod]
[DynamicData(nameof(TestInputs_BeReady), DynamicDataSourceType.Method,
DynamicDataDisplayName = nameof(GetTestDisplayName))]
public void Should_DoSomething(object expValue, object[] inputs, string _)
{
// Arrange
// Act
// Assert
}
public static IEnumerable<object[]> TestInputs_BeReady()
{
List<string> ITEMS_LIST = new List<string> { "entry_01", "entry_02" };
List<string> BLANK_LIST = new List<string>();
return new[]
{
new object[] { true, new object[] { UQID, NAME, ITEMS_LIST }, "All Valid" },
new object[] { false, new object[] { DPID, NAME, ITEMS_LIST }, "Duplicate ID" },
new object[] { false, new object[] { BLNK, NAME, ITEMS_LIST }, "Missing ID" },
new object[] { false, new object[] { UQID, BLNK, ITEMS_LIST }, "Missing Name" },
new object[] { false, new object[] { UQID, NAME, BLANK_LIST }, "Empty List" },
new object[] { false, new object[] { UQID, NAME, null }, "Null List" }
};
}
问题出在 GetTestDisplayNames
方法上。你应该这样定义它
public static string GetTestDisplayNames(MethodInfo methodInfo, object[] values)
{
var expected = (bool)values[0];
var inputs = (object[])values[1];
return $"{methodInfo.Name}({expected}, {inputs.Length})";
}
(这是一种可能的实现方式,但您当然可以 return 不同的名称)
此外,参数 DynamicDataDisplayNameDeclaringType
应指向类型,其中定义了 GetTestDisplayNames
方法。我相信,当您将此方法定义为与测试方法 (Should_BeReady
) 相同的 class 时,可以跳过此参数。
我正在使用 MSTest 执行一些单元测试,我了解到我可以使用 [DynamicData]
属性输入不同的案例进行测试,但我不能使用属性 属性:DynamicDataDisplayName
为不同的案例设置名称。
我的测试代码是:
[TestMethod]
[DynamicData(nameof(TestInputs_BeReady), DynamicDataSourceType.Method,
DynamicDataDisplayName = nameof(GetTestDisplayNames),
DynamicDataDisplayNameDeclaringType = typeof(List<string>))]
public void Should_BeReady(object expValue, object[] inputs)
{
// Arrange
// Act
ui.InputID = (string)inputs[0];
ui.InputName = (string)inputs[1];
ui.InputList = (List<string>)inputs[2];
// Assert
Assert.AreEqual(expValue, onReadyStateChangeArgs.Ready);
}
public static IEnumerable<object[]> TestInputs_BeReady()
{
return new[]
{
new object[] { true, new object[] { "UTSZ0", "Unit Test Size List" , new List<string> { "entry_01", "entry_02" } } },
new object[] { false, new object[] { "STEST", "Unit Test Size List" , new List<string> { "entry_01", "entry_02" } } },
new object[] { false, new object[] { "", "Unit Test Size List" , new List<string> { "entry_01", "entry_02" } } },
new object[] { false, new object[] { "UTSZ0", "" , new List<string> { "entry_01", "entry_02" } } },
new object[] { false, new object[] { "UTSZ0", "Unit Test Size List", new List<string>() } },
new object[] { false, new object[] { "UTSZ0", "Unit Test Size List", null } }
};
}
public static IEnumerable<string> GetTestDisplayNames() => new List<string> {
"All Valid", "Duplicate ID", "Missing ID", "Missing Name", "Empty List", "Null List"
};
我在测试资源管理器结果中收到此消息:
Message: Value cannot be null.
Parameter name: Method GetTestDisplayNames
我在网上搜索了如何使用 DynamicDataDisplayName
但我无法提供一些东西;我发现的只是如何使用 DynamicData
编辑
感谢
,我使用此代码为测试输入添加了自定义名称Matěj Pokorný
[TestMethod]
[DynamicData(nameof(TestInputs_BeReady), DynamicDataSourceType.Method,
DynamicDataDisplayName = nameof(GetTestDisplayName))]
public void Should_DoSomething(object expValue, object[] inputs, string _)
{
// Arrange
// Act
// Assert
}
public static IEnumerable<object[]> TestInputs_BeReady()
{
List<string> ITEMS_LIST = new List<string> { "entry_01", "entry_02" };
List<string> BLANK_LIST = new List<string>();
return new[]
{
new object[] { true, new object[] { UQID, NAME, ITEMS_LIST }, "All Valid" },
new object[] { false, new object[] { DPID, NAME, ITEMS_LIST }, "Duplicate ID" },
new object[] { false, new object[] { BLNK, NAME, ITEMS_LIST }, "Missing ID" },
new object[] { false, new object[] { UQID, BLNK, ITEMS_LIST }, "Missing Name" },
new object[] { false, new object[] { UQID, NAME, BLANK_LIST }, "Empty List" },
new object[] { false, new object[] { UQID, NAME, null }, "Null List" }
};
}
问题出在 GetTestDisplayNames
方法上。你应该这样定义它
public static string GetTestDisplayNames(MethodInfo methodInfo, object[] values)
{
var expected = (bool)values[0];
var inputs = (object[])values[1];
return $"{methodInfo.Name}({expected}, {inputs.Length})";
}
(这是一种可能的实现方式,但您当然可以 return 不同的名称)
此外,参数 DynamicDataDisplayNameDeclaringType
应指向类型,其中定义了 GetTestDisplayNames
方法。我相信,当您将此方法定义为与测试方法 (Should_BeReady
) 相同的 class 时,可以跳过此参数。