如何测试与 ModelState 一起使用的 ActionFilterAttribute?

2024-06-28

正如卡齐·曼祖尔·拉希德(Kazi Manzur Ra​​shid)(以及其他人)在这篇博文 http://weblogs.asp.net/rashid/archive/2009/04/01/asp-net-mvc-best-practices-part-1.aspx, 我在用ActionFilterAttributes重定向时将模型状态从一个请求传输到另一个请求。

但是,我发现自己无法编写单元测试来测试这些属性的行为。举个例子,这就是我想要测试的ImportModelStateAttribute to do:

  1. 设置filterContext以便TempData[myKey]含有一些假“出口”ModelState(这是一个ModelStateDictionary我自己创建,并添加一个错误)
  2. Make ModelState包含一个模型错误。
  3. Call OnActionExecuting.
  4. 验证两个字典是否已合并,并且ModelState现在包含both errors.

我在第一步就已经不知所措了。

EDIT:
是的,我尝试过嘲笑ActionFilterAttribute与最小起订量,但我收到错误说明

不可覆盖成员的设置无效

对彼此而言TempData and ModelState.


Tomas,你不必模拟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);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何测试与 ModelState 一起使用的 ActionFilterAttribute? 的相关文章

随机推荐