asp.net – 单元测试操作过滤器 – 如何模拟ViewResult
发布时间:2020-05-28 20:02:12 所属栏目:asp.Net 来源:互联网
导读:我在SO上进行了搜索,看起来这个问题经常被问到.我已经能够使模拟工作,我也能够执行OnActionExecuted()而没有任何问题.这是我的单元测试.评论的行是失败的,我敢肯定我没有嘲笑正确的类型. //Arrange //var viewResult = new ViewResult(); var filterContextMo
|
我在SO上进行了搜索,看起来这个问题经常被问到.我已经能够使模拟工作,我也能够执行OnActionExecuted()而没有任何问题.这是我的单元测试.评论的行是失败的,我敢肯定我没有嘲笑正确的类型. //Arrange
//var viewResult = new ViewResult();
var filterContextMock = new Mock<ActionExecutedContext>();
var routeData = new RouteData();
var httpContextMock = new Mock<HttpContextBase>();
routeData.Values["data"] = "Mock data";
var requestContext = new RequestContext(httpContextMock.Object,routeData);
var controller = new FakeController();
controller.ControllerContext = new ControllerContext(requestContext,controller);
filterContextMock.Setup(f => f.RouteData).Returns(routeData);
filterContextMock.Setup(f => f.Controller).Returns(controller);
//filterContextMock.Setup(f => f.Result).Returns(viewResult);
//Act
var wrapFilterAttribute = new WrapFilterAttribute();
wrapFilterAttribute.OnActionExecuted(filterContextMock.Object);
这是我的动作过滤器. public class WrapFilterAttribute : ActionFilterAttribute
{
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
var view = (ViewResultBase)filterContext.Result;
if (view != null)
{
BaseViewModel viewModel = (BaseViewModel)view.ViewData.Model ?? new BaseViewModel();
viewModel.Wrap = new WrapperFactory().GetWrap();
}
base.OnActionExecuted(filterContext);
}
}
我在这里遇到的问题是filterContext.Result总是以EmptyResult形式出现.我想改为使用含水的ViewResult.我有什么想法可以做到这一点? 非常感谢! 解决方法首先让我们从修复你的动作过滤器开始,因为当前代码看起来很糟糕,这些演员可能会让你头疼:public class WrapFilterAttribute : ActionFilterAttribute
{
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
var view = filterContext.Result as ViewResultBase;
if (view != null)
{
// the controller action returned a ViewResultBase
var viewModel = view.ViewData.Model as BaseViewModel;
if (viewModel != null)
{
// the model passed to the view was derived from
// BaseViewModel so we can safely update the Wrap
// property
viewModel.Wrap = new WrapperFactory().GetWrap();
}
}
base.OnActionExecuted(filterContext);
}
}
单元测试: // arrange var sut = new WrapFilterAttribute(); var filterContextMock = new Mock<ActionExecutedContext>(); var viewResultMock = new Mock<ViewResultBase>(); filterContextMock.Object.Result = viewResultMock.Object; var viewModel = new BaseViewModel(); viewResultMock.Object.ViewData.Model = viewModel; // act sut.OnActionExecuted(filterContextMock.Object); // assert // TODO: assert something on the viewModel.Wrap property like // for example that it has been initialized 备注:您的动作过滤器对WrapperFactory类有很强的依赖性.这个不好.进一步的改进是将此功能抽象为一个接口,该接口将被注入动作过滤器的构造函数中.这将允许您进一步分离应用程序的不同层之间的关注点. (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- asp.net-mvc-3 – MVC 3客户端验证,模型绑定十进制值和文化
- IIS ASP.NET WebApi在请求同一台服务器时死锁
- asp.net-mvc – .NET 4.5 MVC RouteCollection.LowercaseUr
- asp.net – 来自web.config的Asp .Net自定义成员资格参数
- asp.net-mvc – 如何添加命名空间到自定义路由扩展
- asp.net-ajax – 建议使用不引人注意的AJAX与MVC 5?
- asp.net – 具有MVC的Sitecore’动态占位符’
- asp.net-mvc – 图像URL中的符号MVC导致一个潜在危险的Requ
- asp.net-mvc-3 – 如何使用ASP.NET MVC 3“Razor”查看引擎
- asp.net-mvc – HTML5元素的“传说”太少了
推荐文章
站长推荐
- asp.net-core – 在发布ASP.NET Core应用程序时自
- asp.net – 使用JQuery从viewstate获取值?
- asp.net-mvc – 为多语言ASP.NET MVC Web应用程序
- 我可以首先使用EF代码和.net核心生成迁移脚本
- asp.net – Web部署安装程序(MSI)中没有“IIS 7部
- ASP.NET:获取页面的文件名
- Asp.Net GridView删除Html样式
- 如何防止密码和其他敏感信息出现在ASP.NET转储中
- asp.net-mvc – 记录死亡的所有黄色屏幕,即使它是
- asp.net-mvc – ReadOnly(true)是否与Html.Edito
热点阅读
