如何测试OnActionExecuted过滤器? [英] How to test OnActionExecuted filter?

查看:53
本文介绍了如何测试OnActionExecuted过滤器?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

So I'm overriding OnActionExecuted in my BaseController class to set the CurrentUser property of a BaseViewModel. I'd like to be able to unit test this, but can't figure out how.

代码如下:

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);
    }

这是测试:

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);

运行测试时,出现错误:

When I run the test, I'm getting the error:

System.NotSupportedException : Invalid setup on a non-virtual member: ctx => ctx.Result

我知道我可以在每个派生控制器的单元测试中测试该属性,但是必须有一种更干净的方法来执行此操作.有什么想法吗?

I know I could just test for the property in the unit tests of every derived controller, but there must be a cleaner way to do this. Any ideas?

推荐答案

我认为您不需要模拟ActionExecutedContext.只需创建一个实际的ActionExecutedContext即可传递到您的控制器中.我已经采取了许多自由措施,但请考虑以下控制器代码:

I don't think you need to mock the ActionExecutedContext. Just create an actual ActionExecutedContext to pass into your controller. I have taken a number of liberties, but consider this controller code:

 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);
    }
}

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

And this test code, which is working on my machine:

 [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);
    }

这篇关于如何测试OnActionExecuted过滤器?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆