Tim*_*ima 6 c# unit-testing mstest dynamic-data
我正在使用 MSTest 执行一些单元测试,我了解到我可以使用该[DynamicData]属性来输入不同的情况进行测试,但我无法使用 attribute:DynamicDataDisplayName为不同的情况设置名称。
我的测试代码是:
\n [TestMethod]\n [DynamicData(nameof(TestInputs_BeReady), DynamicDataSourceType.Method,\n DynamicDataDisplayName = nameof(GetTestDisplayNames),\n DynamicDataDisplayNameDeclaringType = typeof(List<string>))]\n public void Should_BeReady(object expValue, object[] inputs)\n {\n // Arrange\n\n // Act\n ui.InputID = (string)inputs[0];\n ui.InputName = (string)inputs[1];\n ui.InputList = (List<string>)inputs[2];\n\n // Assert\n Assert.AreEqual(expValue, onReadyStateChangeArgs.Ready);\n }\n\n public static IEnumerable<object[]> TestInputs_BeReady()\n {\n return new[]\n {\n new object[] { true, new object[] { "UTSZ0", "Unit Test Size List" , new List<string> { "entry_01", "entry_02" } } },\n new object[] { false, new object[] { "STEST", "Unit Test Size List" , new List<string> { "entry_01", "entry_02" } } },\n new object[] { false, new object[] { "", "Unit Test Size List" , new List<string> { "entry_01", "entry_02" } } },\n new object[] { false, new object[] { "UTSZ0", "" , new List<string> { "entry_01", "entry_02" } } },\n new object[] { false, new object[] { "UTSZ0", "Unit Test Size List", new List<string>() } },\n new object[] { false, new object[] { "UTSZ0", "Unit Test Size List", null } }\n };\n }\n\n public static IEnumerable<string> GetTestDisplayNames() => new List<string> {\n "All Valid", "Duplicate ID", "Missing ID", "Missing Name", "Empty List", "Null List"\n };\nRun Code Online (Sandbox Code Playgroud)\n我在测试资源管理器结果中收到此消息:
\n\n\n消息:值不能为空。
\n参数名称:方法 GetTestDisplayNames
\n
我在网上搜索了如何使用DynamicDataDisplayName但我无法找到一些东西;我发现的只是如何使用DynamicData
我使用此代码为测试输入添加自定义名称,感谢
\n\n\nMat\xc4\x9bj Pokorn\xc3\xbd
\n
[TestMethod]\n [DynamicData(nameof(TestInputs_BeReady), DynamicDataSourceType.Method,\n DynamicDataDisplayName = nameof(GetTestDisplayName))]\n public void Should_DoSomething(object expValue, object[] inputs, string _)\n {\n // Arrange\n // Act\n // Assert\n }\n public static IEnumerable<object[]> TestInputs_BeReady()\n {\n List<string> ITEMS_LIST = new List<string> { "entry_01", "entry_02" };\n List<string> BLANK_LIST = new List<string>();\n\n return new[]\n {\n new object[] { true, new object[] { UQID, NAME, ITEMS_LIST }, "All Valid" },\n new object[] { false, new object[] { DPID, NAME, ITEMS_LIST }, "Duplicate ID" },\n new object[] { false, new object[] { BLNK, NAME, ITEMS_LIST }, "Missing ID" },\n new object[] { false, new object[] { UQID, BLNK, ITEMS_LIST }, "Missing Name" },\n new object[] { false, new object[] { UQID, NAME, BLANK_LIST }, "Empty List" },\n new object[] { false, new object[] { UQID, NAME, null }, "Null List" }\n };\n }\nRun Code Online (Sandbox Code Playgroud)\n
问题出在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})";
}
Run Code Online (Sandbox Code Playgroud)
(这是一个可能的实现,但您当然可以返回不同的名称)
另外,参数DynamicDataDisplayNameDeclaringType应该指向类型,GetTestDisplayNames方法定义在哪里。我相信,当您将此方法定义在与测试方法(Should_BeReady)相同的类中时,可以跳过此参数。