【问题标题】:Can I use DebuggerDisplay info in Unit Tests?我可以在单元测试中使用 DebuggerDisplay 信息吗?
【发布时间】:2013-10-22 12:29:20
【问题描述】:

类似:

Assert.AreEqual("Id=7, Name=John", someClass.DebuggerInfo);

【问题讨论】:

    标签: unit-testing nunit vs-unit-testing-framework debuggerdisplay


    【解决方案1】:

    我认为最好覆盖 SomeClassEqualsGetHashCode 方法来比较 Id 和 Name 属性:

    public class SomeClass
    {
        public int Id { get; set; }
        public string Name { get; set; }       
    
        public override bool Equals(object obj)
        {
            SomeClass other = obj as SomeClass;
            if (other == null)
                return false;
    
            return other.Id == Id && other.Name == Name;
        }
    
        // GetHashCode implementation
    }
    

    断言看起来像:

    Assert.AreEqual(expectedObject, someClass);
    

    如果您不想或不能更改SomeClass 的实现,那么您可以创建可以进行断言的方法:

    public void AssertAreEqual(SomeClass expected, SomeClass actual)
    {
        Assert.AreEqual(expected.Id, actual.Id);
        Assert.AreEqual(expected.Name, actual.Name);
    }
    

    评估调试器显示字符串不是简单的任务,因为DebuggerDisplayAttribute 只包含格式字符串,它用于评估调试器中对象的字符串表示形式。除了简单的属性名称之外,该字符串还可以包含表达式和方法调用。您可以在 Roslyn 编译器的帮助下评估调试器显示值,如 here 所述。但我不认为使用调试器元数据是检查对象相等性的好方法。

    【讨论】:

    • 你看,它是一个有这个属性集的外部类,所以我不能修改它。而且我不想仅出于测试目的而覆盖它。
    • Ofc,我可以自己收集那些属性值,但是使用我提供的伪代码不方便吗? )
    • @dbardakov 从某个对象的调试器显示属性评估格式字符串并不是那么简单。 Here 是使用 Roslyn 编译器的解决方案。我会使用一些对象比较器方法来代替
    猜你喜欢
    • 2016-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 2010-09-22
    相关资源
    最近更新 更多