Ich versuche Unit-Test Code mit NUnit zu testen. Ich habe eine Methode: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);
}
Meine Standardcontroller ist eine StructureMap Controller Factory von MvcContrib. Ich benutze auch die MvcMockHelpers von MvcContrib, um mir zu helfen, die HttpContextBase zu verspotten.
Der Controller ich zu Test bin versucht, die oben RenderRoute Methode aufruft und sprengt bei:
IController controller = factory.CreateController(requestContext, controllerName);
Mit dem Fehler:
Controllers.WidgetControllerTests.CanCreateWidgetOnPage: System.Web.HttpException: Die Typinitialisierer für 'System.Web.Compilation.CompilationLock' hat eine Ausnahme ausgelöst. ----> System.TypeInitializationException: Der Typinitialisierer für 'System.Web.Compilation.CompilationLock' hat eine Ausnahme ausgelöst. ----> System.NullReferenceException: Objektreferenz wurde nicht auf eine Instanz eines Objekts gesetzt.
Ich bin ziemlich neu zu Unit Testing/Mocking und es ist eine Möglichkeit, ich sehe nicht etwas einfaches. Hier
ist der Test ich zur Zeit läuft:
[Test]
public void Test()
{
HttpContextBase context = MvcMockHelpers.DynamicHttpContextBase();
string s = RenderExtensions.RenderAction<HomeController>(context, a => a.About());
Console.WriteLine(s);
Assert.IsNotNullOrEmpty(s);
}
Jede Hilfe würde geschätzt.
ich vereinfacht das Problem auf diesem einfachen Gerät zu testen:
[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);
}