Search code examples
c#visual-studiounit-testingmstest

Asserting in MSTEST that a collection OrderBy worked properly


Good morning. I am writing a unit test to validate that my API handler is sorting the collection properly. As you can see, it's mocked data and I intentionally created the test data out of order to test the OrderBy functionality. Once the handler returns the DTO collection, I want to validate that the "act" collection is in the same order as my "expectedDTO" collection. Here's the code:

    [TestMethod]
    public async Task GetByDay_ReturnsDtoList_WhenFound()
    {
        var testData = TestMethodData(); 
        var expectedCalendarDto = ExpectedDto();
        var testCalendar = testData;
        var query = new GetCalendarByDaysQuery();

        _mockCalendarRepo.Setup(m => m.GetItemsAsync(It.IsAny<ISpecification<CalendarDay>>(), null, null))
            .ReturnsAsync(testCalendar);
        var sut = new GetCalendarByDaysHandler(_mockCalendarRepo.Object, _mapper);
        var act = await sut.HandleAsync(query);

        Assert.IsNotNull(act);
        Assert.IsInstanceOfType(act, typeof(IEnumerable<CalendarDto>));
        Assert.AreEqual(expectedCalendarDto, act);
    }

    private GetItemsResult<IEnumerable<CalendarDay>> TestMethodData()
    {
        var testData = new GetItemsResult<IEnumerable<CalendarDay>>();
        testData.ContinuationToken = null;

        testData.Results = new List<CalendarDay>()
        {
            new CalendarDay { Id = "4-5-4|2021-04-01", FiscalYear = 2021, CalendarType = "4-5-4", Quarter = 2, Period = 4, CalendarDate = "2021-04-01", WeekOfYear = 13, DayOfYear = 61, WeekOfPeriod = 1 },
            new CalendarDay { Id = "4-5-4|2021-08-01", FiscalYear = 2021, CalendarType = "4-5-4", Quarter = 3, Period = 8, CalendarDate = "2021-08-01", WeekOfYear = 24, DayOfYear = 121, WeekOfPeriod = 1 },
            new CalendarDay { Id = "4-5-4|2021-01-01", FiscalYear = 2021, CalendarType = "4-5-4", Quarter = 1, Period = 1, CalendarDate = "2021-01-01", WeekOfYear = 1, DayOfYear = 1, WeekOfPeriod = 1 }
        };
        return testData;
    }

    private IEnumerable<CalendarDto> ExpectedDto()
    {
        var testDto = new List<CalendarDto>()
        {
            new CalendarDto {  FiscalYear = 2021, CalendarType = "4-5-4", Quarter = 1, Period = 1, CalendarDate = "2021-01-01", WeekOfYear = 1, DayOfYear = 1, WeekOfPeriod = 1 },
            new CalendarDto {  FiscalYear = 2021, CalendarType = "4-5-4", Quarter = 2, Period = 4, CalendarDate = "2021-04-01", WeekOfYear = 13, DayOfYear = 61, WeekOfPeriod = 1 },
            new CalendarDto {  FiscalYear = 2021, CalendarType = "4-5-4", Quarter = 3, Period = 8, CalendarDate = "2021-08-01", WeekOfYear = 24, DayOfYear = 121, WeekOfPeriod = 1 }
        };
        return testDto;
    }

Currently, in trying to compare the two collections, the test is failing saying that they aren't equal.

Assert.AreEqual failed. Expected:<System.Collections.Generic.List`1[cscentcalendar.infrastructure.DTOs.CalendarDto]>. Actual:<System.Collections.Generic.List`1[cscentcalendar.infrastructure.DTOs.CalendarDto]>. 

Not sure what I'm doing wrong. Any assistance would be greatly appreciated.


Solution

  • I believe I solved the problem by using fluent assertion and adding the following line of code to test the two collections. Let me know if this is incorrect. Thanks again!

        expectedCalendarDto.Should().BeEquivalentTo(act);