微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用DeepEquals忽略列表类型的属性

如何解决使用DeepEquals忽略列表类型的属性

我正在使用DeepEqual库,以测试测试结果是否与预期输出相符。

我做的比较简单

results.ShouldDeepEqual(expected);

但是,我不知道如何忽略列表类型中的属性

我正在比较的类型包含一个列表。此列表中保存的数据类型包含一个我想忽略的Guid属性Id以及一个日期。

忽略顶级属性可以正常工作。但是,我看不到如何忽略列表类型的属性

要暂时解决此问题,我必须自己编写一些代码来清除这些属性,但这显然不理想。

for (var i = 0; i < results.MyList.Count; i++)
{
    results.MyList[i].Id = Guid.Empty;
    expectedResults.MyList[i].Id = Guid.Empty;
}

我该怎么做?

解决方法

通过查看DeepEqual的源代码,该库允许通过IComparison界面进行自定义比较。这样,我模拟了您需要的模型:

public class MyClass
{
    public MyClass()
    {
        MyList = new List<MySubClass>(new[]
        {
            new MySubClass {Id = Guid.Parse("1".PadLeft(32,'0')),Name = "Foo"},new MySubClass {Id = Guid.Parse("2".PadLeft(32,Name = "Bar"},new MySubClass {Id = Guid.Parse("3".PadLeft(32,Name = "Test"},});
    }

    public MyClass(params MySubClass[] subs)
    {
        MyList = new List<MySubClass>(subs);
    }
    
    public List<MySubClass> MyList { get; set; }
}

public class MySubClass
{
    public Guid Id { get; set; }
    public string Name { get; set; }
}

然后我继续创建自定义IComparison类:

public class MySubClassComparer : IComparison
{
    public bool CanCompare(Type type1,Type type2)
    {
        return type1 == type2 && type1 == typeof(MySubClass);
    }

    public (ComparisonResult result,IComparisonContext context) Compare(IComparisonContext context,object value1,object value2)
    {
        if (value1 is MySubClass first && value2 is MySubClass second)
        {
            if (first.Name == second.Name)
            {
                return (ComparisonResult.Pass,context);
            }
        }

        return (ComparisonResult.Fail,context);
    }
}

这是我两个通过的单元测试:

[Fact]
public void IsDeepEqual_ShouldReturnTrue_WhenListHasSameNames()
{
    // Arrange
    MyClass sut = new MyClass();
    MyClass parameter = new MyClass(new[]
    {
        new MySubClass {Id = Guid.Parse("4".PadLeft(32,new MySubClass {Id = Guid.Parse("5".PadLeft(32,new MySubClass {Id = Guid.Parse("6".PadLeft(32,});
    var comparer = new ComparisonBuilder().WithCustomComparison(new MySubClassComparer()).Create();

    // Act
    bool result = sut.IsDeepEqual(parameter,comparer);

    // Assert
    Assert.True(result);
}

[Fact]
public void IsDeepEqual_ShouldReturnFalse_WhenListHasDifferentNames()
{
    // Arrange
    MyClass sut = new MyClass();
    MyClass parameter = new MyClass(new[]
    {
        new MySubClass {Id = Guid.Parse("4".PadLeft(32,Name = "Fail"},comparer);

    // Assert
    Assert.False(result);
}

注释 此比较应忽略Id属性,但不确定这是否是完成任务的最佳方法。有一种IgnoreProperty方法可能更适合该任务,但找不到使它当前运行的方法。

如果有人比我有更多的经验,那么我会使用图书馆。请让我知道更好的方法,然后我将相应地更新我的答案。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?