MVC поразил HttpContext, ошибка привязки модели - PullRequest
0 голосов
/ 09 мая 2011

Я пытаюсь следовать типичному шаблону переопределения ControllerContext, чтобы смоделировать HttpContext.В моем случае я специально хочу проверить HTTP POSTS, поэтому мне нужно смоделировать Request.Form.

Я попробовал все 3 варианта, найденные в Google - с Moq, с Rhino.Mocks и с MVCContrib.TestHelpers.Из-за моей специфики я не смог найти решение.

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

Object reference not set to an instance of an object.
System.NullReferenceException: Object reference not set to an instance of an object.
at Microsoft.Web.Infrastructure.DynamicValidationHelper.ValidationUtility.CollectionReplacer.GetUnvalidatedCollections(HttpContext context)
at System.Web.Helpers.Validation.Unvalidated(HttpRequest request)
at System.Web.Mvc.FormValueProviderFactory.<.ctor>b__0(ControllerContext cc)
at System.Web.Mvc.FormValueProviderFactory.GetValueProvider(ControllerContext controllerContext)
at System.Web.Mvc.ValueProviderFactoryCollection.<>c__DisplayClassc.<GetValueProvider>b__7(ValueProviderFactory factory)
at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
at System.Linq.Enumerable.ToList(IEnumerable`1 source)
at System.Web.Mvc.ValueProviderFactoryCollection.GetValueProvider(ControllerContext controllerContext)
at System.Web.Mvc.Controller.TryUpdateModel(TModel model)
at eServices.Admin.Web.Controllers.User.UserController.Search() in UserController.cs: line 56
at eServices.Admin.Specs.Controllers.when_the_user_controller_is_posted_the_manage_users_find_form.<.ctor>b__1() in UserControllerSpecs.cs: line 96 

Похоже, этоне найдя высмеянную форму.Вот фрагмент кода теста:

MoqHttpContext MoqHttpContext = new MoqHttpContext();
var sut = new UserController(
          UserRepository,
          EmailService,
          SessionProvider);

var controllerContext = new ControllerContext
        (new RequestContext(MoqHttpContext.GetHttpContext(), new RouteData()), sut);
sut.ControllerContext = controllerContext;

MoqHttpContext.FormData.Add("FindCriteria.SearchText", "searchText");
MoqHttpContext.FormData.Add("FindCriteria.AccountIsPending", "true");

sut.Search();

...

в контроллере:

    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Search()
    {
      var manageUsersViewModel = new ManageUsersViewModel();
      TryUpdateModel(manageUsersViewModel);

...

Любые идеи или лучшеРешения для тестирования POST?

1 Ответ

2 голосов
/ 10 мая 2011

Использование MvcContrib.TestHelper :

// arrange
var sut = new SomeController();
var tcb = new TestControllerBuilder();
tcb.InitializeController(sut);
var formValues = new FormCollection() 
{
    { "FindCriteria.SearchText", "searchText" },
    { "FindCriteria.AccountIsPending", "true" },
};
sut.ValueProvider = formValues.ToValueProvider();

// act
var actual = sut.Search();

// assert
...

Любые идеи или лучшие решения для тестирования POST?

Да: вместо использования TryUpdateModel пусть действия вашего контроллера будут напрямую принимать модель представления в качестве аргумента:

[HttpPost]
public ActionResult Search(ManageUsersViewModel model)
{
    ...
}

, затем в вашем модульном тесте:

// arrange
var sut = new SomeController();
var model = new ManageUsersViewModel 
{
    FindCriteria = new FindCriteria
    {
        SearchText = "searchText",
        AccountIsPending = true
    }
};

// act
var actual = sut.Search(model);

// assert
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...