Как проверить ActionFilterAttributes, которые работают с ModelState? - PullRequest
2 голосов
/ 11 апреля 2010

Как предлагает (среди прочего) Кази Манзур Рашид в этом сообщении в блоге , я использую ActionFilterAttributes для передачи состояния модели из одного запроса в другой при перенаправлении.

Однако я не могу написать модульный тест, который проверяет поведение этих атрибутов. Например, вот что я хочу сделать для теста ImportModelStateAttribute:

  1. Настройте filterContext так, чтобы TempData[myKey] содержал некоторую фальшивую "экспортированную" ModelState (то есть ModelStateDictionary, которую я создаю сам, и добавляю одну ошибку в)
  2. Сделать ModelState содержать одну ошибку модели.
  3. Звоните OnActionExecuting.
  4. Убедитесь, что два словаря объединены, и ModelState теперь содержит обе ошибки.

Я в растерянности уже на первом шаге.

EDIT:
Да, я пробовал издеваться ActionFilterAttribute с помощью Moq, но я получаю сообщения об ошибках

Неверная настройка для не перезаписываемого элемента

для TempData и ModelState.

1 Ответ

8 голосов
/ 11 апреля 2010

Томас, Вам не нужно издеваться над filterContext, вы можете создать реальный объект для тестирования фильтра действий, то же самое относится и к состоянию модели, это объекты poco. Единственное, что вам нужно, - это HttpContext (при необходимости).

[Fact]
public void Should_import_complete_view_data()
{
    var attribute = new ImportViewDataFromTempDataAttribute();

    var httpContext = new Mock<HttpContextBase>();
    var requestContext = new RequestContext(httpContext.Object, new RouteData());

    var previousModel = new object();
    var previousViewData = new ViewDataDictionary(previousModel) {{"foo", "bar"}};

    previousViewData.ModelState.AddModelError("foo", "bar");

    var controller = new Mock<ControllerBase>();
    controller.Object.ViewData = new ViewDataDictionary();
    controller.Object.TempData = new TempDataDictionary { { attribute.Key, previousViewData } };

    var controllerContext = new ControllerContext(requestContext, controller.Object);
    var actionContext = new ActionExecutingContext(controllerContext, new Mock<ActionDescriptor>().Object, new Dictionary<string, object>());

    attribute.OnActionExecuting(actionContext);

    Assert.True(actionContext.Controller.ViewData.ContainsKey("foo"));
    Assert.True(actionContext.Controller.ViewData.ModelState.ContainsKey("foo"));
    Assert.Same(previousModel, actionContext.Controller.ViewData.Model);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...