- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我对 SO 进行了搜索,看起来这个问题经常被问到。我已经能够让模拟工作,并且我也能够毫无问题地执行 OnActionExecuted() 。这是我的单元测试。注释行是失败的行,我确信我没有 mock 正确的类型。
//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
类有很强的依赖性。不是很好。进一步的改进是将这个功能抽象到一个接口(interface)中,该接口(interface)将被注入(inject)到 Action 过滤器的构造函数中。这将使您能够进一步分离应用程序不同层之间的关注点。
关于asp.net - 单元测试操作过滤器 - 如何模拟 ViewResult,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3840400/
如果我只返回一个 View ,从 Task 返回它是否有性能差异? [HttpGet] public Task Index() { return Task.FromResult(View());
所以我用函数内部的代码替换了 Controller 函数上的 [Authorize Attribute] 并想尝试返回与属性相同的结果,这可能吗?必须做出进一步的改变? 我试图从一个返回 ViewRe
我对 SO 进行了搜索,看起来这个问题经常被问到。我已经能够让模拟工作,并且我也能够毫无问题地执行 OnActionExecuted() 。这是我的单元测试。注释行是失败的行,我确信我没有 mock
我正在 MVC 5 中创建一个测试项目。 我遇到了错误 Error 1 Cannot convert type 'System.Threading.Tasks.Task' to 'System.Web
我已经编写了这个 Controller 方法和这个测试。 Controller 方法: public async Task Metric(string type, string source) {
我在我的 ASP.NET MVC Controller 上使用自定义授权过滤器,如果用户在特定操作上的授权失败,它会将用户重定向到登录屏幕以外的 url。 这对于返回 View 的操作没有问题,但我的
ASP.NET MVC 中的 ViewResult() 和 ActionResult() 有什么区别? public ViewResult Index() { return View(); }
名为 ViewResult 的 Controller 结果和 PartialViewResult 之间有什么区别?更重要的是,什么时候使用PartialViewResult? 最佳答案 Partial
我有一个 asp.net mvc4 应用程序,当我将其发布到 azure 时,加载页面的时间太长。我安装了glimpse来检查问题出在哪里,它显示 ViewResult.ExecuteResult 是
在我的单元测试中,当我使用 View 的操作名称时,ViewResult.ViewName 属性始终为空: return View(model); or return View(); 这是设计使然吗?
我正在编写一个简单的 CMS。 我希望能够加载一个 View ,将其包含在母版页中,然后扫描 HTML 以便我可以替换一些自定义标签(例如 {{blog}} 与我自己的博客输出)然后服务由浏览器决定。
其他提到 null ViewResults 的问题实际上似乎指的是 null Models(我肯定做计划测试的东西)。我是测试新手。今天刚开始我的第一个使用 TDD 的项目。我找到的一些资源,甚至是新
public override void OnException(ExceptionContext filterContext) { string controllerName = (stri
在我的 Controller 中,我有一个 Edit GET 方法来显示 View ,还有一个 Edit POST 方法来保存更改: public ViewResult Edit(int id) {
我正在尝试创建集成测试以确保我的 View 中没有任何运行时错误。因此,我需要创建一个测试来检查 ViewResult.ExecuteResult() 是否正常工作,但我似乎遇到了麻烦。 我找到了 t
我试图在 OnActionExecuted 方法覆盖 ActionFilterAttribute 类中返回一个 ViewResult 像下面... public override void OnAct
尽管 StackOverflow 上有几篇关于 MVC 中的单元测试操作结果的帖子,但我有一个具体的问题.... 这是我在 Controller 中的 ActionResult: public Act
我制作了一个 MVC 项目,我想将模型设置为来自过滤器的 View 。 但是我不知道,我该怎么做。 模型: public class TestModel { public int ID { g
如何决定是使用 ActionResult 还是 ViewResult?我知道 ActionResult 是一个抽象类,以 ViewResult 作为子类型,但我已经看到使用这两种实现相同功能的示例。它
我正在编写一些单元测试,我有一个场景,如果条件为真, Controller 操作应该返回一个 HttpNotFoundResult,否则它应该返回一个 ViewResult 并在其中包含一个特定的模型
我是一名优秀的程序员,十分优秀!