2009-02-09 2 views
5

Я собираюсь написать некоторые модульные тесты для моих контроллеров в RC1. Вот публичная подпись контроллера я тестирую:Издевательские требования для TryUpdateModel в ASP.Net RC1

 [AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult AcceptColleague() 
    { 

Реализация внутри AcceptColleague использует метод TryUpdateModel (коллега) заселить объект КОЛЛЕГИ из полой формы. Однако при попытке модульного тестирования метода я запускаю ошибку «Ссылка на объект, не установленную на экземпляр объекта» на строке TryUpdateModel.

Вот мой блок кода тест:

  // definition 
     HomeController controller = new HomeController(); 
     IColleagueRepository fakeColleagueRepo = MockRepository.GenerateMock<IColleagueRepository>(); 
     Colleague requestedColleauge = new Colleague(); 
     EmployeeInfo currentUser = new EmployeeInfo();    
     HttpContextBase fakeHttpContext = MockRepository.GenerateMock<HttpContextBase>(); 
     HttpRequestBase fakeHttpRequest = MockRepository.GenerateMock<HttpRequestBase>(); 
     ControllerContext fakeContext = MockRepository.GenerateMock<ControllerContext>(fakeHttpContext, new RouteData(), controller); 
     NameValueCollection fakeForm = new NameValueCollection(); 

     // expectations 
     fakeColleagueRepo.Expect(c => c.Read(1234)).Return(requestedColleauge); 
     fakeColleagueRepo.Expect(c => c.Update(requestedColleauge)); 
     fakeColleagueRepo.Expect(c => c.Add(new Colleague())).IgnoreArguments().Constraints(Is.NotNull()); 
     fakeContext.Expect(cx => cx.HttpContext).Return(fakeHttpContext); 
     fakeHttpContext.Expect(hcx => hcx.Request).Return(fakeHttpRequest); 
     fakeHttpRequest.Expect(hr => hr.Form).Return(fakeForm); 

     // setup 
     controller.ColleagueRepository = fakeColleagueRepo; 
     controller.ControllerContext = fakeContext; 
     requestedColleauge.TargetEmployeeInfoId = 123456; 
     requestedColleauge.GeneratedEmployeeInfoId = 654321; 
     currentUser.EmployeeInfoId = 123456; 
     fakeForm.Add("ColleagueId", "22222"); 

     // action 
     RedirectToRouteResult result = controller.AcceptColleague() as RedirectToRouteResult; 

     // validation 
     Assert.IsNotNull(result, "AcceptColleague() did not return RedirectToRouteResult"); 

Могу ли я что-то отсутствует на насмешки или я должен использовать другую общественную подпись, как AcceptColleague (Коллега коллега), а затем проверить свойство ModelState.IsValid?

Если да, то как не видеть способ Я могу высмеять только свойство ModelState только с контроллера?

ответ

13

TryUpdateModel и ModelState оба требуют ноль mocks в RC 1. Единственное, что вы должны поставить, это ValueProvider. Для этого вы можете использовать FormCollection.ToValueProvider().

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

FormCollection fakeForm = new FormCollection(); 
    fakeForm.Add("ColleagueId", "22222"); 
    controller.ValueProvider = fakeForm.ToValueProvider(); 

    // action 

Примечание: Никакой издевательства над HttpContext, если только ваш код не требует этого.

+1

Крейг, спасибо большое. Наверное, я пропустил это в плавающей документации. Сейчас я работаю как шарм. Еще раз спасибо, Коул –

+3

на самом деле вам нужно, чтобы обеспечить контекст, если вы не вы получите ArgumentNullException, значение не может быть именем null.Parameter: controllerContext –

+0

Mvc 5.2.3 дал Null исключение Омар, описанный выше. controller.ControllerContext = new ControllerContext(); Позволяет тестировать устройство для меня. – Anthony

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