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

前端之家收集整理的这篇文章主要介绍了如何单元测试我的asp.net-mvc控制器的OnActionExecuting方法?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我已经覆盖了我的控制器的OnActionExecuting方法来根据执行的filterContext设置一些内部状态.如何测试这个?该方法本身是受保护的,所以我认为我必须在调用堆栈中更高一些.

我需要测试什么代码

我正在使用mvc RC 1.

编辑:我也使用nunit.

谢谢

解决方法

您需要添加和使用私有访问器.右键单击控制器类,然后从菜单中选择创建私有访问器,并将其添加到测试项目中.一旦进入测试项目,创建您的控制器,然后创建一个访问器.该方法应该在访问器上可用.这是我自己的代码的一个示例测试:
/// <summary>
///A test for OnActionExecuting
///</summary>
[TestMethod()]
[ExpectedException( typeof( InvalidOperationException ) )]
public void OnActionExecutingWindowsIdentityTest()
{
    var identity = WindowsIdentity.GetCurrent();
    WindowsPrincipal principal = new WindowsPrincipal( identity );
    var httpContext = MockRepository.GenerateStub<HttpContextBase>();
    httpContext.User = principal;

    var actionDescriptor = MockRepository.GenerateStub<ActionDescriptor>();

    RouteData routeData = new RouteData();

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

    ActionExecutingContext filterContext = new ActionExecutingContext( controllerContext,actionDescriptor,new Dictionary<string,object>() );

    accessor.OnActionExecuting( filterContext );

}

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

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 });
       }
    }
原文链接:https://www.f2er.com/aspnet/245917.html

猜你在找的asp.Net相关文章