Dan*_*nor 10 asp.net-mvc unit-testing
我已经重写了我的控制器的OnActionExecuting方法,根据执行的filterContext设置一些内部状态.我该如何测试?方法本身受到保护,所以我假设我必须在调用堆栈中更高.
我需要用什么代码来测试它?
我正在使用mvc RC 1.
编辑:我也在使用nunit.
谢谢
tva*_*son 15
您需要添加和使用私人访问者.右键单击控制器类,然后Create Private Accessors从菜单中选择并将它们添加到测试项目中.进入测试项目后,创建控制器,然后为其创建一个访问器.该方法应该在访问器上可用.这是我自己的代码中的示例测试:
/// <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 );
}
Run Code Online (Sandbox Code Playgroud)
编辑:如果您没有使用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 });
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6248 次 |
| 最近记录: |