Files
Umbraco-CMS/src/Umbraco.Tests/TestHelpers/Stubs/TestControllerFactory.cs
T
2016-11-07 19:12:09 +01:00

71 lines
2.3 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Web.Mvc;
using System.Web.Routing;
using System.Web.SessionState;
using Umbraco.Core;
using Umbraco.Core.Logging;
using Umbraco.Core.Plugins;
using Umbraco.Web;
namespace Umbraco.Tests.TestHelpers.Stubs
{
/// <summary>
/// Used in place of the UmbracoControllerFactory which relies on BuildManager which throws exceptions in a unit test context
/// </summary>
internal class TestControllerFactory : IControllerFactory
{
private readonly UmbracoContext _umbracoContext;
private readonly ILogger _logger;
public TestControllerFactory(UmbracoContext umbracoContext, ILogger logger)
{
_umbracoContext = umbracoContext;
_logger = logger;
}
public IController CreateController(RequestContext requestContext, string controllerName)
{
var types = TypeFinder.FindClassesOfType<ControllerBase>(new[] { Assembly.GetExecutingAssembly() });
var controllerTypes = types.Where(x => x.Name.Equals(controllerName + "Controller", StringComparison.InvariantCultureIgnoreCase));
var t = controllerTypes.SingleOrDefault();
if (t == null)
return null;
var possibleParams = new object[]
{
_umbracoContext, _logger
};
var ctors = t.GetConstructors();
foreach (var ctor in ctors.OrderByDescending(x => x.GetParameters().Length))
{
var args = new List<object>();
var allParams = ctor.GetParameters().ToArray();
foreach (var parameter in allParams)
{
var found = possibleParams.SingleOrDefault(x => x.GetType() == parameter.ParameterType);
if (found != null) args.Add(found);
}
if (args.Count == allParams.Length)
{
return Activator.CreateInstance(t, args.ToArray()) as IController;
}
}
return null;
}
public SessionStateBehavior GetControllerSessionBehavior(RequestContext requestContext, string controllerName)
{
return SessionStateBehavior.Disabled;
}
public void ReleaseController(IController controller)
{
controller.DisposeIfDisposable();
}
}
}