【问题标题】:C# Unit Test DynamicDataDisplayName using MSTest使用 MSTest 的 C# 单元测试 DynamicDataDisplayName
【发布时间】:2022-01-05 08:16:39
【问题描述】:

我正在使用 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"
    };

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

消息:值不能为空。

参数名称:方​​法GetTestDisplayNames

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


编辑

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

马特杰·波科尼

    [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" }
        };
    }

【问题讨论】:

    标签: c# unit-testing mstest dynamic-data


    【解决方案1】:

    问题在于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})";
    }
    

    (这是一种可能的实现,当然你也可以返回一个不同的名字)

    另外,参数DynamicDataDisplayNameDeclaringType 应该指向类型,GetTestDisplayNames 方法定义在哪里。我相信,当您将此方法定义在与测试方法(Should_BeReady)相同的类中时,可以跳过此参数。

    【讨论】:

    • 好的。但这不会返回自定义名称,如“All Valid”、“Duplicate ID”、...等。无论如何,谢谢。我会戳戳和篡改这段代码,看看我还能做什么。
    • 是的,这是不可能的,因为当前运行的测试用例的index无法从GetTestDisplayNames方法中获取。您可以做的最好的事情是在返回的object[](在TestInputs_BeReady)中包含一些内容,然后在GetTestDisplayNames 方法中使用它...
    • 是的,这是我在测试中发现的。我将尝试使用一些代码修改问题以帮助其他人。谢谢@Matěj Pokorný
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-26
    • 1970-01-01
    • 2011-12-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多