Próbuję przeprowadzić test jednostkowy kodu za pomocą NUnit. Mam metodę:ASP.NET Mvc - System.Web.Compilation.CompilationLock
public static string RenderRoute(HttpContextBase context, RouteValueDictionary values)
{
var routeData = new RouteData();
foreach (var kvp in values)
{
routeData.Values.Add(kvp.Key, kvp.Value);
}
string controllerName = routeData.GetRequiredString("controller");
var requestContext = new RequestContext(context, routeData);
IControllerFactory factory = ControllerBuilder.Current.GetControllerFactory();
IController controller = factory.CreateController(requestContext, controllerName);
var ActionInvoker = new ControllerActionInvoker();
var controllerContext = new ControllerContext(requestContext, (ControllerBase)controller);
((ControllerBase)controller).ControllerContext = controllerContext;
string actionName = routeData.GetRequiredString("action");
Action action = delegate { ActionInvoker.InvokeAction(controllerContext, actionName); };
return new BlockRenderer(context).Capture(action);
}
Moja domyślna instalacja kontrolna to fabryka kontrolera StructureMap z MvcContrib. Używam również MvcMockHelpers od MvcContrib, aby pomóc mi kpić z HttpContextBase.
Kontroler jestem próby testu wywołuje powyższą metodę RenderRoute i wysadza w:
IController controller = factory.CreateController(requestContext, controllerName);
z błędem:
Controllers.WidgetControllerTests.CanCreateWidgetOnPage: System.Web.HttpException: Inicjator typu dla "System.Web.Compilation.CompilationLock" rzucił wyjątek. ----> System.TypeInitializationException: Inicjator typu dla "System.Web.Compilation.CompilationLock" rzucił wyjątek. ----> System.NullReferenceException: Odwołanie do obiektu nie jest ustawione na wystąpienie obiektu.
Jestem całkiem nowy w testowaniu jednostkowym/szyderczym i istnieje możliwość, że nie widzę czegoś prostego.
Oto test Jestem obecnie pracuje:
[Test]
public void Test()
{
HttpContextBase context = MvcMockHelpers.DynamicHttpContextBase();
string s = RenderExtensions.RenderAction<HomeController>(context, a => a.About());
Console.WriteLine(s);
Assert.IsNotNullOrEmpty(s);
}
Każda pomoc będzie mile widziane.
I uproszczone problemu w dół do tego prostego testu jednostkowego:
[Test]
public void Test2()
{
HttpContextBase context = MvcMockHelpers.DynamicHttpContextBase();
var routeData = new RouteData();
routeData.Values.Add("Controller", "Home");
routeData.Values.Add("Action", "About");
string controllerName = routeData.GetRequiredString("controller");
var requestContext = new RequestContext(context, routeData);
IControllerFactory factory = ControllerBuilder.Current.GetControllerFactory();
IController controller = factory.CreateController(requestContext, controllerName);
Assert.IsNotNull(controller);
}