Вам необходимо добавить и использовать приватный аксессор. Щелкните правой кнопкой мыши по классу контроллера и выберите в меню 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 );
}
РЕДАКТИРОВАТЬ : Если вы не используете 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 });
}
}