Musisz dodać i używać prywatnego dostępu. Kliknij prawym przyciskiem myszy klasę kontrolera i wybierz z menu opcję Create Private Accessors
i dodaj je do swojego projektu testowego. Po przejściu do projektu testowego utwórz kontroler, a następnie utwórz dla niego akcesorium. Metoda powinna być dostępna na akcesorze. Oto przykładowy test z własnego kodu:
/// <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: Jeśli nie jesteś przy użyciu MSTest dla testów jednostkowych, być może trzeba będzie generować akcesorów ręcznie. Zasadniczo tworzysz klasę opakowania, która ujawnia prywatne/chronione metody badanej klasy za pomocą równoważnych publicznych metod, przekazuje instancję testowanej klasy do opakowania, a następnie używa refleksji z klasy opakowania, aby wywołać prywatne/chronione metoda na testowanej klasie.
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 });
}
}
Czy ten MST jest konkretny? Używam atmów nunit i xunit. –
Pytam tylko dlatego, że nie widzę przycisku kontekstowego "dodawaj elementu dodającego", a wyszukiwanie w Google przynosi mi pewne testy specyficzne dla ms. –
Tak, myślę, że tak. Przypuszczam, że wymaga to przynajmniej wersji VS Pro, aby ją tam było. Możesz jednak utworzyć je ręcznie i użyć odbicia, aby wywołać odpowiednią metodę na bazowym obiekcie prywatnym. – tvanfosson