繁体   English   中英

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

[英]How do I test ActionFilterAttributes that work with ModelState?

正如(其中包括)Kazi Manzur Ra​​shid在这篇博客文章中所建议的那样,我在使用ActionFilterAttributes在重定向时将模型状态从一个请求转移到另一个请求。

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

  1. 设置filterContext以便TempData[myKey]包含一些虚假的“导出” ModelState (也就是我自己创建的ModelStateDictionary ,并添加一个错误)
  2. 使ModelState包含一个模型错误。
  3. 调用OnActionExecuting
  4. 验证两个词典是否已合并, ModelState现在包含两个错误。

我已经迈出了第一步。

编辑:
是的,我已经尝试用Moq模拟ActionFilterAttribute ,但是我收到错误说明

不可覆盖的成员上的设置无效

对于TempDataModelState

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);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM