How to assert that two list contains elements with the same public properties in NUnit?

后端 未结 10 1773
日久生厌
日久生厌 2021-02-04 02:20

I want to assert that the elements of two list contains values that I expected, something like:

var foundCollection = fooManager.LoadFoo();
var expectedCollectio         


        
10条回答
  •  故里飘歌
    2021-02-04 02:53

    REWORKED ANSWER

    There is a CollectionAssert.AreEqual(IEnumerable, IEnumerable, IComparer) overload to assert that two collections contain the same objects in the same order, using an IComparer implementation to check the object equivalence.

    In the scenario described above, the order is not important. However, to sufficiently handle also the situation where there are multiple equivalent objects in the two collections, it becomes necessary to first order the objects in each collection and use one-by-one comparison to ensure that also the number of equivalent objects are the same in the two collections.

    Enumerable.OrderBy provides an overload that takes an IComparer argument. To ensure that the two collections are sorted in the same order, it is more or less required that the types of the identifying properties implement IComparable. Here is an example of a comparer class that implements both the IComparer and IComparer interfaces, and where it is assumed that Bar takes precedence when ordering:

    public class FooComparer : IComparer, IComparer
    {
        public int Compare(object x, object y)
        {
            var lhs = x as Foo;
            var rhs = y as Foo;
            if (lhs == null || rhs == null) throw new InvalidOperationException();
            return Compare(lhs, rhs);
        }
    
        public int Compare(Foo x, Foo y)
        {
            int temp;
            return (temp = x.Bar.CompareTo(y.Bar)) != 0 ? temp : x.Bar2.CompareTo(y.Bar2);
        }
    }
    

    To assert that the objects in the two collections are the same and comes in equal numbers (but not necessarily in the same order to begin with), the following lines should do the trick:

    var comparer = new FooComparer();
    CollectionAssert.AreEqual(
        expectedCollection.OrderBy(foo => foo, comparer), 
        foundCollection.OrderBy(foo => foo, comparer), comparer);    
    

提交回复
热议问题