如何解决使用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 举报,一经查实,本站将立刻删除。