我已经重写了我的控制器的OnActionExecuting方法,根据执行的filterContext设置一些内部状态.我该如何测试?方法本身受到保护,所以我假设我必须在调用堆栈中更高.
我需要用什么代码来测试它?
我正在使用mvc RC 1.
编辑:我也在使用nunit.
谢谢
您需要添加和使用私人访问者.右键单击控制器类,然后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 }); } }