Dinesh
Dinesh

Reputation: 1007

How to mock Automapper (IMapper) in controller

I am trying to write a unit test for my existing MVC Web Aplication. In that I am facing some problem in automapper (IMapper) Whenever am using map function it returns null value.

My Controller Code:

public class UserAdministrationController : BaseController
{
    private readonly iUserService _userService;
    private readonly IMapper _mapper;

    public NewsController(iUserService userService, IMapper mapper)
    {
        _userService = userService;
        _mapper = mapper;
    }

    public ActionResult Create(int CompanyID == 0)
    {            
        UserDetail data = _userService(CompanyID);
        var Modeldata = _mapper.Map<UserDetailViewModel, UserDetail>(data);
        return View(Modeldata);
    }
} 

Mock Mapping Code:

public class MappingDataTest : CommonTestData
{
    public Mock<IMapper> MappingData()
    {
        var mappingService = new Mock<IMapper>();
        UserDetailViewModel interview = getUserDetailViewModel(); // get value of UserDetailViewModel
        UserDetail im = getUserDetail(); // get value of UserDetails

        mappingService.Setup(m => m.Map<UserDetail, UserDetailViewModel>(im)).Returns(interview);
        mappingService.Setup(m => m.Map<UserDetailViewModel, UserDetail>(interview)).Returns(im);

        return mappingService;
    }
}

Mocking Code:

[TestClass]
public class UserAdminControllerTest
{
    private MappingDataTest _common;

    [TestInitialize]
    public void TestCommonData()
    {
        _common = new MappingDataTest();
    }

    [TestMethod]
    public void UserCreate()
    {
        //Arrange                                               
        UserAdministrationController controller = new UserAdministrationController(_common.mockUserService().Object, _common.MappingData().Object);
        controller.ControllerContext = _common.GetUserIdentity(controller);

        // Act
        ViewResult newResult = controller.Create() as ViewResult;

        // Assert
        Assert.IsNotNull(newResult);
    }
}

Mapper is not working its always showing the null value in controller. kindly help me. Thanks in Advance.

Upvotes: 11

Views: 16455

Answers (2)

Jimmy Bogard
Jimmy Bogard

Reputation: 26785

I would recommend not mocking AutoMapper. There's not much value in controller unit tests for one, and this is similar to mocking a JSON serializer. Just use the real thing.

Upvotes: 27

Barletta
Barletta

Reputation: 224

You should try the following:

public class MappingDataTest : CommonTestData
{
    public Mock<IMapper> MappingData()
    {
        var mappingService = new Mock<IMapper>();

        UserDetail im = getUserDetail(); // get value of UserDetails

        mappingService.Setup(m => m.Map<UserDetail, UserDetailViewModel>(It.IsAny<UserDetail>())).Returns(interview); // mapping data
        mappingService.Setup(m => m.Map<UserDetailViewModel, UserDetail>(It.IsAny<UserDetailtViewModel>())).Returns(im); // mapping data

        return mappingService;
    }
}

The thing is, your mock was expecting the exact instance of UserDetailViewModel interview = getUserDetailViewModel(); to setup this mapping, and this is why it was returning null. Null it will be expecting any reference to UserDetailViewModel and for any reference to UserDetailtViewModel it will return the expected mapped instance.

Upvotes: 8

Related Questions