正如卡齐·曼祖尔·拉希德(Kazi Manzur Rashid)(以及其他人)在这篇博文 http://weblogs.asp.net/rashid/archive/2009/04/01/asp-net-mvc-best-practices-part-1.aspx, 我在用ActionFilterAttributes
重定向时将模型状态从一个请求传输到另一个请求。
但是,我发现自己无法编写单元测试来测试这些属性的行为。举个例子,这就是我想要测试的ImportModelStateAttribute
to do:
- 设置
filterContext
以便TempData[myKey]
含有一些假“出口”ModelState
(这是一个ModelStateDictionary
我自己创建,并添加一个错误)
- Make
ModelState
包含一个模型错误。
- Call
OnActionExecuting
.
- 验证两个字典是否已合并,并且
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(使用前将#替换为@)