È necessario aggiungere e utilizzare una funzione di accesso privato. Fai clic con il tasto destro del mouse sulla classe controller e scegli Create Private Accessors
dal menu e aggiungili al tuo progetto di test. Una volta nel progetto di test, crea il controller, quindi crea un accesso per esso. Il metodo dovrebbe essere disponibile sull'accessorio. Ecco un test di esempio dal mio codice:
/// <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);
}
EDIT: Se non siete usando MSTest per il test di unità, potrebbe essere necessario generare le funzioni di accesso a mano. In sostanza, si crea una classe wrapper che espone i metodi privati / protetti della classe sotto test tramite metodi pubblici equivalenti, passa un'istanza della classe sotto test al wrapper e quindi usa reflection dalla classe wrapper per richiamare il private/protected metodo sulla classe sotto test.
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 });
}
}
Questo MSTest è specifico? Sto usando nunit e xunit atm. –
Chiedo solo perché non vedo il pulsante di contesto "aggiungi Accessor" e facendo una ricerca su Google mi porta in alcuni test di MS materiale specifico. –
Sì, penso che lo sia. Suppongo che sia necessario almeno VS Pro perché sia lì. Puoi comunque crearne uno a mano e usare reflection per invocare il metodo appropriato sull'oggetto privato sottostante. – tvanfosson