2013-02-27 5 views
0

У меня есть контроллер с именем «UserController» с методом «Пригласить». Мой контроллер имеет следующий метод переопределения:Единичные тесты - метод пользовательского контроллера

DBRepository _repository; 
protected override void Initialize(System.Web.Routing.RequestContext requestContext) 
{ 
    base.Initialize(requestContext); 
      _repository = new DBRepository(); 

} 

так, этот метод вызывается каждый раз, когда создается класс UserController.

Мой метод «Пригласить» имеет следующие строки:

var startTime = _repository.Get<AllowedTime>(p => p.TimeID == selectTimeStart.Value); 

, но когда я пытаюсь вызвать этот метод с помощью метода Unit:

[TestMethod()] 
[UrlToTest("http://localhost:6001/")] 
public void InviteTest() 
{ 
    UserController target = new UserController(); // TODO: Initialize to an appropriate value 
    int? selectTimeStart = 57; 
    int? selectTimeEnd = 61; 
    Nullable<int> selectAttachToMeeting = new Nullable<int>(); // TODO: Initialize to an appropriate value 
    int InvitedUserID = 9; // TODO: Initialize to an appropriate value 
    UserInviteModel model = new UserInviteModel(); 
    model.Comment = "BLA_BLA_BLA"; 
    ActionResult expected = null; // TODO: Initialize to an appropriate value 
    ActionResult actual; 
    actual = target.Invite(selectTimeStart, selectTimeEnd, selectAttachToMeeting, InvitedUserID, model); 
    Assert.AreEqual(expected, actual); 
    Assert.Inconclusive("Verify the correctness of this test method."); 
} 

я получил ошибку «Ссылка не установлен. .. ". Я понимаю, почему это происходит (_repository имеет значение null, потому что метод Initialize не вызывается в моем случае, но как это сделать правильно?

ответ

1

Если вы ожидаете, что DBRepository фактически выполнит Get из вашего хранилища данных резервного копирования во время теста, вы можете изменить _repository поле, чтобы быть Lazy<DBRepository>, который инициализируется при первом использовании. (я предполагаю, что это является new Ed в методе Initialize, а не конструктор, поскольку он зависит от текущего контекста запроса?)

Если вы хотите, чтобы это был настоящий модульный тест, он не должен тестировать класс DBRepository: вы должны программировать интерфейс, который вы можете макетировать. Кроме того, вам нужно сделать так, чтобы ваш DBRepository происходит от места, где он может быть предоставлен тестовым чехлом. Вы могли бы создать его на заводе или предоставить в качестве одноэлементного варианта, и тестовый пример мог бы настроить фабрику или синглтон, чтобы заранее высмеивать объект. Тем не менее, подход best должен был бы использовать Injection Dependency, поэтому вы можете предоставить поддельный/макет IDBRepository при построении new UserController().

+0

Можете ли вы показать мне пример? –

+0

@ user285336: К сожалению, это довольно обширная тема, и конкретная реализация в вашем случае будет зависеть от деталей вашей системы, которые выходят за рамки вопроса StackOverflow. Лучшее, что я могу предложить, - потратить некоторое время на изучение инъекций зависимостей и насмешек по отношению к Unit Tests. – StriplingWarrior

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