2013-07-19 3 views
0

Так что я пытаюсь проверить случай, когда этот метод будет возвращать «ManagerEventsIndex»:Как издеваются контроллер, который реализует интерфейс

public ActionResult Index() 
    { 
     if (this.CurrentUser != null) 
     { 
      if (this.CurrentUser.Role.Name == AvailableRoles.GameManager) 
      { 
       var model = new GameManagerEventsIndexModel(); 
       model.NumLocationsOfCurrentUser = this._customerLocationDataProvider.GetAllForUserId(CurrentUser.Id) 
                        .Where(x => x.Active == true) 
                        .Count(); 
       return View("ManagerEventsIndex", model); 
      } 
      else 
      { 
       return View(); 
      } 
     } 
     else 
      return View("PublicIndex"); 
    } 

Но этот контроллер реализует другой контроллер ApplicationController, как так: EventsController: ApplicationController, и это объект CurrentUser в контроллере приложения, который мне нужно высмеять, чтобы проверить это ... вот мой метод тестирования. Благодарю.

[TestMethod] 
    public void AssertGameManagerRoleReturnsGameManagerIndex() 
    { 
     // Arrange 
     //eventsController = new EventsController(eventDataProvider.Object, playerEventDataProvider.Object, userDataProvider.Object, 
               tokenAuthent.Object, dataContext.Object, customerLocationDataProvider.Object); 

     var user = new Mock<User>(); 
     var role = new Mock<Role>(); 
     role.SetupSet(x => x.Name = "Ted"); 
     user.SetupSet(x => x.Role = role.Object); 

     //?? var appController = new Mock<ApplicationController>(); 
     //?? appController.SetupSet(x => x.User = user); 

     // var mController = new Mock<EventsController>(); 

     // Act 
     var result = (ViewResult) eventsController.Index(); 

     // Assert 
     Assert.AreEqual("ManagerEventsIndex", result.ViewName); 
    } 

ответ

2

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

При тестировании вы хотите, чтобы все биты, которые не являются частью системного теста (SUT), можно манипулировать. Это позволяет вам прокручивать все остальные биты для создания сценариев.

Если пользователь что-то вы хотите Твик независимо от контроллера у вас есть два варианта:

  • сделать объект, который вы хотите Твик доступны извне (в данном случае сделать пользы)
  • Отделить ваш пользователь от фактической реализации и передать IUserService или подобное в класс во время строительства.

Это даст вам доступ, чтобы иметь возможность играть с объектом в ваших тестах. Обычно, когда вы сталкиваетесь с такими проблемами, когда вещи немного сложно проверить на своем хорошем индикаторе, что вы не модулировали вас SUT должным образом.

+0

хм, так что нет способа сделать контрольный контроллер и в то же время указать интерфейс имитации, который он должен реализовать? – 1Canuck16

+1

@mapleafman Я не думаю, что moq поддерживает что-то подобное. Вы можете либо издеваться над целым интерфейсом или целым экземпляром (не присоединяться к ним вместе). я полагаю, что моя точка зрения заключается в том, что если вы чувствуете, что вам приходится делать сумасшедшие вещи в своих тестах, чтобы создать сценарий, то обычно это запах кода, предполагающий, что, возможно, вы не нарушили фактический SUT в правильном направлении –

+0

спасибо, что я ценю это , и я согласен, просто работая над этим с кем-то другим, и это в основном их дизайн, просто пытался понять, есть ли что-то, что можно было бы сделать, спасибо – 1Canuck16

Смежные вопросы