断言两个相等的对象列表UnitC#

断言两个相等的对象列表UnitC#,c#,vs-unit-testing-framework,C#,Vs Unit Testing Framework,我目前正在对复制函数进行一些单元测试,需要比较旧列表和新复制列表中的对象元素。 它工作得很好,但我想知道我是否可以用一种不涉及for循环的方式来完成它。 这是我的目标: new NaturePointObject { SId = 1, Name = "Test", Category = NaturePointCategory.Category1,

我目前正在对复制函数进行一些单元测试,需要比较旧列表和新复制列表中的对象元素。 它工作得很好,但我想知道我是否可以用一种不涉及for循环的方式来完成它。 这是我的目标:

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,但是你有一个特定的断言来确保它们不相等。看来你真的很在乎。。。