2016-12-22 3 views
1

Я работаю над веб-проектом, который получает данные из конечной точки API. Уровень API находится сверху уровня обслуживания и уровня хранилища внизу. Я написал модульное тестирование для Уровней обслуживания и API. Я использую структуру Moq для извлечения зависимостей. Теперь я хочу протестировать контроллер MVC. Я использую класс Request Manager, который является производным от HttpClient для получения данных из конечных точек API. Итак, как я могу проверить этот контроллер. Я написал единичный тест, но тест получает данные непосредственно из моей базы данных.Тестирование контроллера Mvc, который получает данные из конечной точки API

public class UserController : Controller 
{ 
    private RequestManager requestManager = new RequestManager(); 
    // GET: User 
    public async Task<ActionResult> Index() 
    { 
     List<UserViewModel> allUsers = await requestManager.GetUsers(); 

     if(allUsers == null) 
     { 
      throw new HttpException(404, "No Users Found"); 
     } 

     return View(allUsers); 
    } 
} 

public class UserControllerTest 
{ 
    public UserController controller; 

    [OneTimeSetUp] 
    public void InIt() 
    { 
     controller = new UserController(); 
    } 
    [Test] 
    public async Task TestIndex() 
    { 
     var view = await controller.Index() as ActionResult; 
     Assert.That(view is ViewResult); 
     Assert.That(view.Model is List<UserViewModel>); 
    } 
} 
+1

абстрактная прокладка плотной связи и выявление зависимостей, чтобы их можно было издеваться/заменять, что обеспечивало большую гибкость во время модульного испытания. Вам нужно будет подумать о рефакторе, чтобы улучшить проверяемость вашего кода. Либо это, либо подумайте об использовании специального обработчика сообщений в вашем производном классе менеджера httpclient – Nkosi

+1

Да, похоже, что я должен ввести интерфейс IRequestManager в контроллер и издеваться над ним. Как поможет мне обработчик пользовательских сообщений? –

ответ

0

Вы должны отвязать контроллер и менеджер. Извлеките интерфейс от RequestManager и введите его в контроллер. Это не должно быть проблемой, контейнер Ioc может это сделать для вас.

public class UserController : Controller 
{ 
    private RequestManager _requestManager; 

    public UserController(IRequestManager requestManager) 
    { 
     _requestManager = requestManager; 
    } 

    // GET: User 
    public async Task<ActionResult> Index() 
    { 
     List<UserViewModel> allUsers = await _requestManager.GetUsers(); 

     if(allUsers == null) 
     { 
      throw new HttpException(404, "No Users Found"); 
     } 

     return View(allUsers); 
    } 
} 

Затем в ваших модульных тестах вы можете издеваться над IRequestManager.

public class UserControllerTest 
{ 
    [Test] 
    public async Task TestIndex() 
    { 
     //arrange 
     Mock<IRequestManager> requestManager = new Mock<IRequestManager>(); 
     //setup what you want here... 
     UserController sut = new UserController(requestManager.Object);//suggest to use AutoMoqer for this. 

     //act 
     var view = await sut.Index() as ActionResult; 

     //assert 
     Assert.That(view is ViewResult); 
     Assert.That(view.Model is List<UserViewModel>); 
    } 
} 
0

Попробуйте один ..

public class UserController : Controller 
{ 
    private RequestManager requestManager = new RequestManager(); 
    Mock<RequestManager> mockRepository = new Mock<RequestManager>(); 
    Mock<UserViewModel> mockUserViewModel = new Mock<UserViewModel>(); 
    ViewResult viewResult; 

    // GET: User 
    public async Task<ActionResult> Index() 
    { 
     List<UserViewModel> allUsers = await requestManager.GetUsers(); 

     if(allUsers == null) 
     { 
      throw new HttpException(404, "No Users Found"); 
     } 

     return View(allUsers); 
    } 
} 

public class UserControllerTest 
{ 
    public UserController controller; 

    [OneTimeSetUp] 
    public void InIt() 
    { 
     controller = new UserController(); 
    } 
    [Test] 
    public async Task TestIndexWhenAllUsersNULL() 
    { 
     var view = await controller.Index() as ActionResult; 
     List<mockUserViewModel> listofusermodel = new List<mockUserViewModel>(); 
     //add some dummy data in your List so it will not getting data directly from your Database 
     mockRepository.Setup(x => requestManager.GetUsers()).Returns(listofusermodel); 
     Assert.That(view is ViewResult); 
     Assert.That(view.Model is List<mockUserViewModel>); 
    } 
} 
Смежные вопросы