Je tente de tester un peu de code en utilisant NUnit. J'ai une méthode: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);
}
Mon défaut ControllerFactory est une usine de contrôleur de StructureMap de MvcContrib. J'utilise aussi les MvcMockHelpers de MvcContrib pour m'aider à simuler le HttpContextBase.
Le contrôleur je tente de tester appelle la méthode RenderRoute ci-dessus et explose à:
IController controller = factory.CreateController(requestContext, controllerName);
Avec l'erreur:
Controllers.WidgetControllerTests.CanCreateWidgetOnPage: System.Web.HttpException: Le type initializer pour 'System.Web.Compilation.CompilationLock' a lancé une exception. ----> System.TypeInitializationException: l'initialiseur de type pour 'System.Web.Compilation.CompilationLock' a généré une exception. ----> System.NullReferenceException: Référence d'objet non définie sur une instance d'un objet. Je suis relativement nouveau dans les tests unitaires/moqueurs et c'est une possibilité que je ne vois pas quelque chose de simple.
Voici le test que je suis en cours d'exécution:
[Test]
public void Test()
{
HttpContextBase context = MvcMockHelpers.DynamicHttpContextBase();
string s = RenderExtensions.RenderAction<HomeController>(context, a => a.About());
Console.WriteLine(s);
Assert.IsNotNullOrEmpty(s);
}
Toute aide serait appréciée.
J'ai simplifié le problème à ce simple test unitaire:
[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);
}