public void should_create_controllers_by_its_name_case_insensitively() { var controllerTypes = new[] { typeof(ControllerWithPublicAction) }; HttpController controller = new DefaultControllerFactory().CreateController( "controllerwithpublicaction", controllerTypes, new DefaultDependencyResolver(controllerTypes)); Assert.Equal(typeof(ControllerWithPublicAction), controller.GetType()); }
/// <summary> /// Initializes the controller type cache of the default controller factory. /// </summary> private void InitializeControllerTypeCache() { DefaultControllerFactory defaultControllerFactory = System.Web.Mvc.DependencyResolver.Current.GetService <IControllerFactory>() as DefaultControllerFactory ?? (ControllerBuilder.Current.GetControllerFactory() as DefaultControllerFactory ?? new DefaultControllerFactory()); MethodInfo getControllerTypesMethod = defaultControllerFactory.GetType().GetMethod("GetControllerTypes", BindingFlags.Instance | BindingFlags.NonPublic); getControllerTypesMethod.Invoke(defaultControllerFactory, null); }
public void should_create_controllers() { var controllerTypes = new [] { typeof(ControllerWithPublicAction) }; HttpController controller = new DefaultControllerFactory().CreateController( "ControllerWithPublicAction", controllerTypes, new DefaultDependencyResolver(controllerTypes)); Assert.Equal(typeof(ControllerWithPublicAction), controller.GetType()); }
private static void InjectKnownControllerTypes(DefaultControllerFactory controllerFactory, params Type[] controllerTypes) { // D'oh!!! Hey MVC people, how is this testable? ;) // locate the appropriate reflection member info var controllerTypeCacheProperty = controllerFactory.GetType() .GetProperty("ControllerTypeCache", BindingFlags.Instance | BindingFlags.NonPublic); var cacheField = controllerTypeCacheProperty.PropertyType.GetField("_cache", BindingFlags.NonPublic | BindingFlags.Instance); // turn the array into the correct collection var cache = controllerTypes .GroupBy(t => t.Name.Substring(0, t.Name.Length - "Controller".Length), StringComparer.OrdinalIgnoreCase) .ToDictionary(g => g.Key, g => g.ToLookup(t => t.Namespace ?? string.Empty, StringComparer.OrdinalIgnoreCase), StringComparer.OrdinalIgnoreCase); // execute: controllerFactory.ControllerTypeCache._cache = cache; cacheField.SetValue( controllerTypeCacheProperty.GetValue(controllerFactory, null), cache); }