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);
}
我的默认控制器工厂是MvcContrib的StructureMap控制器工厂。我还使用MvcContrib的MvcMockHelpers来帮助我模拟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);
}