断言两个相等的对象列表UnitC#
我目前正在对复制函数进行一些单元测试,需要比较旧列表和新复制列表中的对象元素。 它工作得很好,但我想知道我是否可以用一种不涉及for循环的方式来完成它。 这是我的目标:断言两个相等的对象列表UnitC#,c#,vs-unit-testing-framework,C#,Vs Unit Testing Framework,我目前正在对复制函数进行一些单元测试,需要比较旧列表和新复制列表中的对象元素。 它工作得很好,但我想知道我是否可以用一种不涉及for循环的方式来完成它。 这是我的目标: new NaturePointObject { SId = 1, Name = "Test", Category = NaturePointCategory.Category1,
new NaturePointObject
{
SId = 1,
Name = "Test",
Category = NaturePointCategory.Category1,
CreatorType = CreatorTypeEnum.1,
NaturR = NaturR.Bn,
Description = "Test",
Kumulation = Kumulation.EnEjendom,
Id = 1
}
我的旧列表包含“NaturePointObject”,称为naturPointList,它将被复制到名为newNaturePointList的列表中。
下面是我如何断言它是否成功复制的:
Assert.AreEqual(naturPointList.Count,newNaturePointList.Count);
for (var i = 0; i < newNatureList.Count; i++)
{
Assert.AreEqual(naturPointList[i].Category, newNaturePointList[i].Category);
Assert.AreEqual(naturPointList[i].Description, newNaturePointList[i].Description);
Assert.AreEqual(naturPointList[i].Kumulation, newNaturePointList[i].Kumulation);
Assert.AreEqual(naturPointList[i].Name, newNaturePointList[i].Name);
Assert.AreEqual(naturPointList[i].CreatorType, newNaturePointList[i].CreatorType);
Assert.AreEqual(naturPointList[i].NaturR, newNaturePointList[i].NaturR);
Assert.AreNotEqual(naturPointList[i].SId, newNaturePointList[i].SId);
}
Assert.AreEqual(naturPointList.Count、newNaturePointList.Count);
for(var i=0;i
正如您所看到的,并非对象的所有元素都必须相等。我不在乎对象的“Id”
有没有比运行for循环更短的方法呢?您可以试试
Assert.IsTrue(naturPointList.SequenceEqual(newNaturePointList));
如果要忽略Id,可以创建其他类(不带Id)
稍后编辑:您可以覆盖Equals方法并忽略Id。您可能希望使用
CollectionAssert
:
CollectionAssert.AreEqual(naturPointList, newNaturePointList, NaturePointObject.CategoryCreatorTypeComparer);
您需要记住的唯一一件事是,您需要实现IComparer
,以便在Assert
方法中使用:
public class NaturePointObject
{
private static readonly Comparer<NaturePointObject> CategoryCreatorTypeComparerInstance = new CategoryCreatorTypeRelationalComparer();
private sealed class CategoryCreatorTypeRelationalComparer : Comparer<NaturePointObject>
{
public override int Compare(NaturePointObject x, NaturePointObject y)
{
// compare fields which makes sense
if (ReferenceEquals(x, y)) return 0;
if (ReferenceEquals(null, y)) return 1;
if (ReferenceEquals(null, x)) return -1;
var categoryComparison = string.Compare(x.Category, y.Category, StringComparison.Ordinal);
if (categoryComparison != 0) return categoryComparison;
return string.Compare(x.CreatorType, y.CreatorType, StringComparison.Ordinal);
}
}
public static Comparer<NaturePointObject> CategoryCreatorTypeComparer
{
get
{
return CategoryCreatorTypeComparerInstance;
}
}
public int SId { get; set; }
public string Category { get; set; }
//other properties
public string CreatorType { get; set; }
}
公共类NaturePointObject
{
私有静态只读比较器CategoryCreatorTypeCompareInstance=new CategoryCreatorTypeRelationalComparer();
私有密封类类别CreatorTypeRelationalComparer:Comparer
{
公共覆盖整型比较(NaturePointObject x,NaturePointObject y)
{
//比较有意义的字段
if(ReferenceEquals(x,y))返回0;
if(ReferenceEquals(null,y))返回1;
if(ReferenceEquals(null,x))返回-1;
var categoryComparison=string.Compare(x.Category,y.Category,StringComparison.Ordinal);
如果(categoryComparison!=0)返回categoryComparison;
返回string.Compare(x.CreatorType,y.CreatorType,StringComparison.Ordinal);
}
}
公共静态比较器类别CreatorTypeComparer
{
得到
{
返回CategoryCreatorTypeCompareInstance;
}
}
公共int SId{get;set;}
公共字符串类别{get;set;}
//其他属性
公共字符串创建者类型{get;set;}
}
以哪种方式缩短?您可以使用LinQ查询来避免循环stuf,但它仍然会在引擎盖下创建一个循环。因为您实际上是在进行对象比较(忽略ID),所以您可以将其作为nuget包进行查看。@fharreau只是看得比较短而已。它在引擎盖下是一样的并不重要。@Aravind会看一看。你说你不关心对象的Id,但是你有一个特定的断言来确保它们不相等。看来你真的很在乎。。。