es necesario agregar y utilizar un descriptor de acceso privado. Haga clic con el botón derecho en su clase de controlador y seleccione Create Private Accessors
en el menú y agréguelas a su proyecto de prueba. Una vez que esté en su proyecto de prueba, cree su controlador y luego cree un acceso para él. El método debe estar disponible en el descriptor de acceso. Aquí está una prueba de muestra de mi propio código:
/// <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);
}
EDITAR: Si no está utilizando MSTest para sus pruebas de unidad, puede que tenga que generar los descriptores de acceso con la mano. Básicamente, usted hace una clase contenedora que expone los métodos privados/protegidos de la clase bajo prueba a través de métodos públicos equivalentes, pasa una instancia de la clase bajo prueba a la envoltura y luego usa la reflexión de la clase contenedora para invocar a los privados/protegidos método en la clase bajo prueba.
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 });
}
}
¿Es esto MSTest específico? Estoy usando nunit y xunit atm. –
Solo pregunto porque no veo el botón de contexto 'Agregar acceso' y hacer una búsqueda en Google me lleva a probar algo específico. –
Sí, creo que sí. Supongo que requiere al menos VS Pro para que esté allí. Sin embargo, puede crear uno a mano y usar la reflexión para invocar el método apropiado en el objeto privado subyacente. – tvanfosson