Я пытаюсь протестировать код с помощью NUnit. У меня есть метод:
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);
}
Моя фабрика контроллеров по умолчанию - фабрика контроллеров StructureMap от MvcContrib. Я также использую MvcMockHelpers от MvcContrib, чтобы помочь мне издеваться над HttpContextBase.
Контроллер, который я пытаюсь проверить, вызывает вышеупомянутый метод RenderRoute и взрывается при:
IController controller = factory.CreateController(requestContext, controllerName);
С ошибкой:
Controllers.WidgetControllerTests.CanCreateWidgetOnPage:
System.Web.HttpException: инициализатор типа для 'System.Web.Compilation.CompilationLock' вызвал исключение.
----> System.TypeInitializationException: инициализатор типа для 'System.Web.Compilation.CompilationLock' вызвал исключение.
----> System.NullReferenceException: ссылка на объект не установлена для экземпляра объекта.
Я довольно новичок в модульном тестировании / издевательстве, и есть вероятность, что я не вижу чего-то простого.
Вот тест, который я сейчас выполняю:
[Test]
public void Test()
{
HttpContextBase context = MvcMockHelpers.DynamicHttpContextBase();
string s = RenderExtensions.RenderAction<HomeController>(context, a => a.About());
Console.WriteLine(s);
Assert.IsNotNullOrEmpty(s);
}
Любая помощь будет оценена.
Я упростил задачу до этого простого модульного теста:
[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);
}