Search code examples
c#unit-testingtddassert

Assert to compare two lists of objects C#


I am currently trying to learn how to use unit testing, and I have created the actual list of 3 animal objects and the expected list of 3 animal objects. The question is how do I Assert to check the lists are equal? I have tried CollectionAssert.AreEqual and Assert.AreEqual but to no avail. Any help would be appreciated.

The test method:

  [TestMethod]
    public void createAnimalsTest2()
    {
        animalHandler animalHandler = new animalHandler();
        // arrange
        List<Animal> expected = new List<Animal>();
        Animal dog = new Dog("",0);
        Animal cat = new Cat("",0);
        Animal mouse = new Mouse("",0);
        expected.Add(dog);
        expected.Add(cat);
        expected.Add(mouse);
        //actual
        List<Animal> actual = animalHandler.createAnimals("","","",0,0,0);


        //assert
        //this is the line that does not evaluate as true
        Assert.Equals(expected ,actual);

    }

Solution

  • Just incase someone comes across this in the future, the answer was I had to create an Override, IEqualityComparer as described below:

    public class MyPersonEqualityComparer : IEqualityComparer<MyPerson>
    {
    public bool Equals(MyPerson x, MyPerson y)
    {
        if (object.ReferenceEquals(x, y)) return true;
    
        if (object.ReferenceEquals(x, null)||object.ReferenceEquals(y, null)) return false;
    
        return x.Name == y.Name && x.Age == y.Age;
    }
    
    public int GetHashCode(MyPerson obj)
    {
        if (object.ReferenceEquals(obj, null)) return 0;
    
        int hashCodeName = obj.Name == null ? 0 : obj.Name.GetHashCode();
        int hasCodeAge = obj.Age.GetHashCode();
    
        return hashCodeName ^ hasCodeAge;
    }
    

    }