public void CreateControllerReleaser_ReturnsReleaser()
        {
            // Arrange
            var controller = new object();
            var factory    = new DefaultControllerFactory(
                Mock.Of <IControllerActivator>(),
                Enumerable.Empty <IControllerPropertyActivator>());
            Action <ControllerContext, object> expected = (_, __) => { };
            var activatorProvider = new Mock <IControllerActivatorProvider>();

            activatorProvider.Setup(p => p.CreateReleaser(It.IsAny <ControllerActionDescriptor>()))
            .Returns(expected)
            .Verifiable();
            var provider = new ControllerFactoryProvider(
                activatorProvider.Object,
                factory,
                Enumerable.Empty <IControllerPropertyActivator>());
            var descriptor = new ControllerActionDescriptor
            {
                ControllerTypeInfo = typeof(object).GetTypeInfo(),
            };

            // Act
            var actual = provider.CreateControllerReleaser(descriptor);

            // Assert
            Assert.Same(expected, actual);
            activatorProvider.Verify();
        }
        public void CreateControllerFactory_UsesControllerActivatorAndPropertyActivator()
        {
            // Arrange
            var expectedProperty1  = new object();
            var expectedProperty2  = new object();
            var expectedController = new TestController();
            var factory            = new DefaultControllerFactory(
                Mock.Of <IControllerActivator>(),
                Enumerable.Empty <IControllerPropertyActivator>());
            var activatorProvider = new Mock <IControllerActivatorProvider>();

            activatorProvider.Setup(p => p.CreateActivator(It.IsAny <ControllerActionDescriptor>()))
            .Returns(_ => expectedController)
            .Verifiable();

            var propertyActivator1 = new Mock <IControllerPropertyActivator>();

            propertyActivator1.Setup(p => p.GetActivatorDelegate(It.IsAny <ControllerActionDescriptor>()))
            .Returns((context, controllerObject) =>
            {
                ((TestController)controllerObject).ActivatedValue1 = expectedProperty1;
            })
            .Verifiable();

            var propertyActivator2 = new Mock <IControllerPropertyActivator>();

            propertyActivator2.Setup(p => p.GetActivatorDelegate(It.IsAny <ControllerActionDescriptor>()))
            .Returns((context, controllerObject) =>
            {
                ((TestController)controllerObject).ActivatedValue2 = expectedProperty2;
            })
            .Verifiable();

            var propertyActivators = new[]
            {
                propertyActivator1.Object,
                propertyActivator2.Object,
            };
            var provider = new ControllerFactoryProvider(
                activatorProvider.Object,
                factory,
                propertyActivators);
            var descriptor = new ControllerActionDescriptor
            {
                ControllerTypeInfo = typeof(TestController).GetTypeInfo(),
            };

            // Act
            var factoryDelegate = provider.CreateControllerFactory(descriptor);
            var controller      = factoryDelegate(new ControllerContext());

            // Assert
            var actual = Assert.IsType <TestController>(controller);

            Assert.Same(expectedController, actual);
            Assert.Same(expectedProperty1, actual.ActivatedValue1);
            Assert.Same(expectedProperty2, actual.ActivatedValue2);
            activatorProvider.Verify();
            propertyActivator1.Verify();
            propertyActivator2.Verify();
        }