当前位置:  开发笔记 > 后端 > 正文

如何对我的asp.net-mvc控制器的OnActionExecuting方法进行单元测试?

如何解决《如何对我的asp.net-mvc控制器的OnActionExecuting方法进行单元测试?》经验,为你挑选了1个好方法。

我已经重写了我的控制器的OnActionExecuting方法,根据执行的filterContext设置一些内部状态.我该如何测试?方法本身受到保护,所以我假设我必须在调用堆栈中更高.

我需要用什么代码来测试它?

我正在使用mvc RC 1.

编辑:我也在使用nunit.

谢谢



1> tvanfosson..:

您需要添加和使用私人访问者.右键单击控制器类,然后Create Private Accessors从菜单中选择并将它们添加到测试项目中.进入测试项目后,创建控制器,然后为其创建一个访问器.该方法应该在访问器上可用.这是我自己的代码中的示例测试:

/// 
///A test for OnActionExecuting
///
[TestMethod()]
[ExpectedException( typeof( InvalidOperationException ) )]
public void OnActionExecutingWindowsIdentityTest()
{
    var identity = WindowsIdentity.GetCurrent();
    WindowsPrincipal principal = new WindowsPrincipal( identity );
    var httpContext = MockRepository.GenerateStub();
    httpContext.User = principal;

    var actionDescriptor = MockRepository.GenerateStub();

    RouteData routeData = new RouteData();

    BaseController controller = new BaseController();
    BaseController_Accessor accessor = new BaseController_Accessor( new PrivateObject( controller ) );
    ControllerContext controllerContext = MockRepository.GenerateStub( httpContext, routeData, controller );

    ActionExecutingContext filterContext = new ActionExecutingContext( controllerContext, actionDescriptor, new Dictionary() );

    accessor.OnActionExecuting( filterContext );

}

编辑:如果您没有使用MSTest进行单元测试,则可能需要手动生成访问器.本质上,您创建一个包装类,通过等效的公共方法公开被测试类的私有/受保护方法,将测试中的类的实例传递给包装器,然后使用包装类中的反射来调用private/protected被测班的方法.

   public class MyClass
   {
       protected void DoSomething( int num )
       {
       }
   }

   public class MyClass_accessor
   {
       private MyClass privateObj;

       public MyClass_accessor( MyClass obj )
       {
           this.privateObj = obj;
       }

       public void DoSomething( int num )
       {
           MethodInfo info = privateObj.GetType()
                                       .GetMethod("DoSomething",
                                                   BindingFlags.NonPublic
                                                   | BindingFlags.Instance );

           info.Invoke(obj,new object[] { num });
       }
    }

推荐阅读
重庆制造漫画社
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有