如何在控制器中模拟Automapper(IMapper)

Din*_*esh 6 c# asp.net-mvc unit-testing mocking automapper

我正在尝试为我现有的MVC Web应用程序编写单元测试.因为我在automapper(IMapper)中遇到一些问题每当使用map函数时它返回null值.

我的控制器代码:

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);
    }
} 
Run Code Online (Sandbox Code Playgroud)

模拟映射代码:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

模拟代码:

[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);
    }
}
Run Code Online (Sandbox Code Playgroud)

Mapper无法始终显示null控制器中的值.请帮助我.提前致谢.

Jim*_*ard 8

我建议不要嘲笑AutoMapper.一个控制器单元测试没有多少价值,这类似于模拟JSON序列化器.只需使用真实的东西.

  • 我觉得OP应该听您的话。您可能对此主题有一些了解。:-) (2认同)

小智 6

您应该尝试以下操作:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

问题是,您的模拟期望 UserDetailViewModel 面试 = getUserDetailViewModel(); 的确切实例。设置此映射,这就是它返回 null 的原因。Null 它将期待对 UserDetailViewModel 的任何引用,对于任何对 UserDetailtViewModel 的引用,它将返回预期的映射实例。