Automapper in xUnit testing and .NET Core 2.0

20,563

Finally it worked for me, I followed this way How to Write xUnit Test for .net core 2.0 Service that uses AutoMapper and Dependency Injection?

Here I am posting my answer and Test Class so if needed other SO's can use.

public class SchedulesControllerTests
{
    [Fact]
    public void CanGet()
    {
        try
        {
            //Arrange
            //Repository
            Mock<IScheduleRepository> mockRepo = new Mock<IScheduleRepository>();
            var schedules = new List<Schedule>(){
                new Schedule() { Id=1, Title = "Schedule1" },
                new Schedule() { Id=2, Title = "Schedule2" },
                new Schedule() { Id=3, Title = "Schedule3" }
            };

            mockRepo.Setup(m => m.items).Returns(value: schedules);

            //auto mapper configuration
            var mockMapper = new MapperConfiguration(cfg =>
            {
                cfg.AddProfile(new AutoMapperProfile());
            });
            var mapper = mockMapper.CreateMapper();

            SchedulesController controller = new SchedulesController(repository: mockRepo.Object, mapper: mapper);

            //Act
            var result = controller.Get();

            //Assert
            var okResult = result as OkObjectResult;
            if (okResult != null)
                Assert.NotNull(okResult);

            var model = okResult.Value as IEnumerable<ScheduleDto>;
            if (model.Count() > 0)
            {
                Assert.NotNull(model);

                var expected = model?.FirstOrDefault().Title;
                var actual = schedules?.FirstOrDefault().Title;

                Assert.Equal(expected: expected, actual: actual);
            }
        }
        catch (Exception ex)
        {
            //Assert
            Assert.False(false, ex.Message);
        }
    }
}
Share:
20,563
Bharat
Author by

Bharat

Updated on July 09, 2022

Comments

  • Bharat
    Bharat almost 2 years

    I have .NET Core 2.0 Project which contains Repository pattern and xUnit testing.

    Now, here is some of it's code.

    Controller:

    public class SchedulesController : Controller
    {
        private readonly IScheduleRepository repository;
        private readonly IMapper mapper;
    
        public SchedulesController(IScheduleRepository repository, IMapper mapper)
        {
            this.repository = repository;
            this.mapper = mapper;
        }
    
        [HttpGet]
        public IActionResult Get()
        {
            var result = mapper.Map<IEnumerable<Schedule>, IEnumerable<ScheduleDto>>(source: repository.items);
            return new OkObjectResult(result);
        }
    }
    

    My Test Class:

    public class SchedulesControllerTests
    {
        [Fact]
        public void CanGet()
        {
            try
            {
                //Arrange
                Mock<IScheduleRepository> mockRepo = new Mock<IScheduleRepository>();
                mockRepo.Setup(m => m.items).Returns(new Schedule[]
                {
                    new Schedule() { Id=1, Title = "Schedule1" },
                    new Schedule() { Id=2, Title = "Schedule2" },
                    new Schedule() { Id=3, Title = "Schedule3" }
                });
    
                var mockMapper = new Mock<IMapper>();
                mockMapper.Setup(x => x.Map<Schedule>(It.IsAny<ScheduleDto>()))
                    .Returns((ScheduleDto source) => new Schedule() { Title = source.Title });
    
                SchedulesController controller = new SchedulesController(repository: mockRepo.Object, mapper: mockMapper.Object);
    
                //Act
                var result = controller.Get();
    
                //Assert
                var okResult = result as OkObjectResult;
                Assert.NotNull(okResult);
    
                var model = okResult.Value as IEnumerable<ScheduleDto>;
                Assert.NotNull(model);
    
            }
            catch (Exception ex)
            {
                //Assert
                Assert.False(false, ex.Message);
            }
        }
    }
    

    Issue I Am facing.

    My Issue is that when I run this code with database context and execute Get() method, it works fine, it gives me all results.

    But when I tries to run test case, it's not returning any data of Dto object. When I debugged I found that

    1. I am getting my test object in controller using mockRepo.

    2. But it looks like Auto mapper is not initialized correctly, because while mapping it's not returning anything in

      var result = mapper.Map<IEnumerable<Schedule>, IEnumerable<ScheduleDto>>(source: repository.items);

    What I tried So Far?

    I followed all this answers but still it's not working.

    Mocking Mapper.Map() in Unit Testing

    How to Mock a list transformation using AutoMapper

    So, I need help from someone who is good in xUnit and automapper, and need guidance on how to initialize mock Mapper correctly.