2017-05-06 47 views
6

我正在嘗試爲現有的MVC Web應用程序編寫單元測試。因爲我在自動映射器中遇到了一些問題(IMapper)無論何時使用映射函數,它都會返回null的值。如何模擬控制器中的自動映射器(IMapper)

我的控制器編碼:

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); 
    } 
} 

素映射代碼:

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; 
    } 
} 

懲戒代碼:

[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); 
    } 
} 

映射器不工作其總是示出在控制器的null值。請幫助我。提前致謝。

+1

可能想問「爲什麼我需要?」 Automapper可以斷言映射配置是正確的。推測您的用戶服務已經過測試。因此不需要測試你的控制器。 – Mardoxx

+0

雅這很好。這是我的客戶要求,他們也要求爲控制器進行單元測試。然後在httppost中它可能有一些額外的功能,所以我需要這樣做,請幫助我從此。 – Dinesh

回答

1

你應該嘗試以下操作:

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; 
    } 
} 

的事情是,你的模擬期待UserDetailViewModel採訪= getUserDetailViewModel()的具體實例;設置這個映射,這就是爲什麼它返回null。它將期待任何對UserDetailViewModel的引用,並且對於UserDetailtViewModel的任何引用,它都會返回預期的映射實例。

+0

它顯示錯誤信息爲「無法從'方法組'轉換爲'UserDetail'」 – Dinesh

4

我會建議不要嘲笑AutoMapper。控制器單元測試中沒有太多價值,這與模擬JSON串行器相似。只要使用真實的東西。

+1

我覺得OP應該傾聽你的意見。您可能對這個主題有一些瞭解。 :-) –

+0

我同意你的看法,儘管在控制器中使用具體實現困擾了我很多。 – Esen