2015-02-19 3 views
0

Я пытаюсь написать единичный тест для проверки контроллера для всех пользователей. Но я путаю Как я могу написать модульного тестирования с automapperКак написать единичный тест для контроллера, использующего automapper?

контроллер:

Test Controller:

private Mock<IUserService> _userServiceMock; 
    UserController objUserController; 
    List<UserViewModel> listUser; 

    [SetUp] 
    public void Initialize() 
    { 
     _userServiceMock = new Mock<IUserService>(); 
     objUserController = new UserController(_userServiceMock.Object); 
     listUser = new List<UserViewModel>() 
     { 
      new UserViewModel() {Id = 1, Active = true, Password = "123456", UserName = "hercules"}, 
      new UserViewModel() {Id = 2, Active = false, Password = "1234567", UserName = "alibaba"}, 
      new UserViewModel() {Id = 3, Active = true, Password = "12345678", UserName = "robinhood"}, 
     }; 
    } 

    [Test] 
    public void Index_Returns_AllUser() 
    { 
     // How do I here ??? 
    } 
+0

Хорошо для начала, что фактически возвращается '_userService.GetAllUsers()' и что вы планируете делать с 'listUser' –

ответ

1

Вы пытаетесь написать тест, который практически не имеет значения. Не пишите этот тест. Используйте реальный IUserService и используйте реальный AutoMapper и утверждайте против ViewResult.

Я бы никогда не проверил этот код.

Но если вы абсолютно склонны писать этот модульный тест, не издевайтесь над AutoMapper. Откажитесь от IUserService.

UserController objUserController; 
List<User> listUser; 

[SetUp] 
public void Initialize() 
{ 
    var userServiceMock = new Mock<IUserService>(); 
    listUser = new List<User>() 
    { 
     new User() {Id = 1, Active = true, Password = "123456", UserName = "hercules"}, 
     new User() {Id = 2, Active = false, Password = "1234567", UserName = "alibaba"}, 
     new User() {Id = 3, Active = true, Password = "12345678", UserName = "robinhood"}, 
    }; 
    userServiceMock.Setup(framework => framework.GetAllUsers()) 
    .Returns(listUser); 

    objUserController = new UserController(_userServiceMock.Object); 
} 

[Test] 
public void Index_Returns_AllUser() 
{ 
    var result = objUserController.List(); 

    var viewResult = result as ViewResult; 

    viewResult.ShouldNotBe(null); 
    var model = viewResult.Model as List<UserListModel>; 
    model.ShouldNotBe(null); 

    model.Count.ShouldBe(3); // Don't do more than this 
} 
4

Настройка automapper, как вы делаете на вашем проекте MVC:

[SetUp] 
public void Initialize() 
{ 
    .... 
    AutoMapperConfiguration.Configure(); 
} 

Где AutoMapperConfiguration является общедоступным статическим классом, например:

public class AutoMapperConfiguration 
{ 

    /// <summary> 
    /// Maps between VIEWMODEL and MODEL 
    /// </summary> 
    public static void Configure() 
    { 
     //maps here 
     Mapper.CreateMap.. 
    } 
} 
1

Вы можете создать класс-оболочку для automapper с интерфейсом. Например:

public interface IMapperWrapper 
{ 
    object Map(object source, Type sourceType, Type destinationType); 
} 

Тогда все, что вам нужно сделать в своих тестах, - это ваша карта.

automapperWrapperMock.Setup(x => x.Map, type, type); 
0

Просто настройте контроллер, назначив конфигурацию Automapper, и все ваши тесты для этого контроллера будут работать правильно.

[TestInitialize] 
    public void Setup() 
    { 
     controller = new yourController(_unitOfWork.Object, _someRepository.Object) 
     { 

     }; 

     AutoMapperConfig.RegisterMappings(); 
    } 
Смежные вопросы