首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何测试OnActionExecuted过滤器?

如何测试OnActionExecuted过滤器?
EN

Stack Overflow用户
提问于 2011-03-04 23:04:19
回答 1查看 1.7K关注 0票数 0

因此,我在BaseController类中重写OnActionExecuted来设置BaseViewModel的CurrentUser属性。我希望能够对此进行单元测试,但不知道如何进行。

代码如下:

代码语言:javascript
复制
protected override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        if (filterContext.Result is ViewResult && ((ViewResult)filterContext.Result).ViewData.Model != null)
        {
            ((BaseViewModel)((ViewResult)filterContext.Result).ViewData.Model).CurrentUser = CurrentUser;
        }

        base.OnActionExecuted(filterContext);
    }

下面是测试结果:

代码语言:javascript
复制
BaseController controller = new BaseController();
Mock<ActionExecutedContext> MockActionExecutedContext = new Mock<ActionExecutedContext>();
MockActionExecutedContext.Setup(ctx => ctx.Result).Returns(new ViewResult());
controllerAccessor.OnActionExecuted(MockActionExecutedContext.Object);

ViewResult vr = MockActionExecutedContext.Object.Result as ViewResult;
BaseViewModel model = vr.ViewData.Model as BaseViewModel;
User currentUser = model.CurrentUser;
Assert.NotNull(currentUser);

当我运行测试时,我得到了错误:

代码语言:javascript
复制
System.NotSupportedException : Invalid setup on a non-virtual member: ctx => ctx.Result

我知道我可以在每个派生控制器的单元测试中测试属性,但必须有一种更干净的方法来做到这一点。有什么想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-02-11 17:27:26

我不认为你需要嘲笑ActionExecutedContext。只需创建一个实际的ActionExecutedContext传递给您的控制器即可。我使用了一些自由,但请考虑下面的控制器代码:

代码语言:javascript
复制
 public class BaseController : Controller
{
    public User CurrentUser { get; set; }

    protected override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        if (filterContext.Result is ViewResult && ((ViewResult)filterContext.Result).ViewData.Model != null)
        {
            ((BaseViewModel)((ViewResult)filterContext.Result).ViewData.Model).CurrentUser = CurrentUser;
        }

        base.OnActionExecuted(filterContext);
    }

    public void controllerAccessor(ActionExecutedContext filterContext)
    {
        OnActionExecuted(filterContext);
    }
}

下面的测试代码在我的机器上运行:

代码语言:javascript
复制
 [TestMethod]
    public void YourTest()
    {
        // Arrange
        var inUser = new User();
        BaseController controller = new BaseController() { CurrentUser = inUser };
        var ctx = new ActionExecutedContext();
        var inVr = new ViewResult();
        var baseVm = new BaseViewModel();
        inVr.ViewData.Model = baseVm;
        ctx.Result = inVr;

        // Act
        controller.controllerAccessor(ctx);

        // Assert
        ViewResult outVr = (ViewResult)ctx.Result;
        BaseViewModel model = (BaseViewModel)outVr.ViewData.Model;
        User outUser = model.CurrentUser;
        Assert.AreEqual(inUser, outUser);
    }
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5195405

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档