使用 MSTest 的 C# 单元测试 DynamicDataDisplayName

Tim*_*ima 6 c# unit-testing mstest dynamic-data

我正在使用 MSTest 执行一些单元测试,我了解到我可以使用该[DynamicData]属性来输入不同的情况进行测试,但我无法使用 attribute:DynamicDataDisplayName为不同的情况设置名称。

\n

我的测试代码是:

\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    };\n
Run Code Online (Sandbox Code Playgroud)\n

我在测试资源管理器结果中收到此消息:

\n
\n

消息:值不能为空。

\n

参数名称:方​​法 GetTestDisplayNames

\n
\n

我在网上搜索了如何使用DynamicDataDisplayName但我无法找到一些东西;我发现的只是如何使用DynamicData

\n
\n

编辑

\n

我使用此代码为测试输入添加自定义名称,感谢

\n
\n

Mat\xc4\x9bj Pokorn\xc3\xbd

\n
\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    }\n
Run Code Online (Sandbox Code Playgroud)\n

Mat*_*rný 6

问题出在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)相同的类中时,可以跳过此参数。