Tom*_*han 2 c# asp.net-mvc unit-testing modelstate action-filter
正如(其中包括)Kazi Manzur Rashid在这篇博客文章中所建议的那样,我ActionFilterAttributes在重定向时用于将模型状态从一个请求转移到另一个请求.
但是,我发现自己无法编写测试这些属性行为的单元测试.作为一个例子,这就是我想要做的测试ImportModelStateAttribute:
filterContext以便TempData[myKey]包含一些假的"导出" ModelState(也就是说,ModelStateDictionary我创建自己,并添加一个错误)ModelState包含一个模型误差.OnActionExecuting.ModelState现在包含两个错误.我已经迈出了第一步.
编辑:
是的,我曾尝试ActionFilterAttribute用Moq 嘲笑,但我得到错误说明
不可覆盖的成员上的设置无效
对于TempData和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);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4160 次 |
| 最近记录: |