From 13d97fffdfa21021a46ae235857b051250e5af87 Mon Sep 17 00:00:00 2001 From: Stephan Date: Mon, 11 Mar 2019 17:14:07 +0100 Subject: [PATCH] IFactory is resolvable --- src/Umbraco.Core/Composing/Composition.cs | 6 ++- .../Composing/CompositionTests.cs | 53 +++++++++++++++++++ src/Umbraco.Tests/Umbraco.Tests.csproj | 1 + 3 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 src/Umbraco.Tests/Composing/CompositionTests.cs diff --git a/src/Umbraco.Core/Composing/Composition.cs b/src/Umbraco.Core/Composing/Composition.cs index d7686ccd07..34c5296dce 100644 --- a/src/Umbraco.Core/Composing/Composition.cs +++ b/src/Umbraco.Core/Composing/Composition.cs @@ -133,7 +133,11 @@ namespace Umbraco.Core.Composing Configs.RegisterWith(_register); - return _register.CreateFactory(); + IFactory factory = null; + // ReSharper disable once AccessToModifiedClosure -- on purpose + _register.Register(_ => factory, Lifetime.Singleton); + factory = _register.CreateFactory(); + return factory; } /// diff --git a/src/Umbraco.Tests/Composing/CompositionTests.cs b/src/Umbraco.Tests/Composing/CompositionTests.cs new file mode 100644 index 0000000000..f4478e2add --- /dev/null +++ b/src/Umbraco.Tests/Composing/CompositionTests.cs @@ -0,0 +1,53 @@ +using System; +using Moq; +using NUnit.Framework; +using Umbraco.Core; +using Umbraco.Core.Cache; +using Umbraco.Core.Composing; +using Umbraco.Core.Logging; + +namespace Umbraco.Tests.Composing +{ + [TestFixture] + public class CompositionTests + { + [Test] + public void FactoryIsResolvable() + { + Func factoryFactory = null; + + var mockedRegister = Mock.Of(); + var mockedFactory = Mock.Of(); + + // the mocked register creates the mocked factory + Mock.Get(mockedRegister) + .Setup(x => x.CreateFactory()) + .Returns(mockedFactory); + + // the mocked register can register a factory factory + Mock.Get(mockedRegister) + .Setup(x => x.Register(It.IsAny>(), Lifetime.Singleton)) + .Callback, Lifetime>((ff, lt) => factoryFactory = ff); + + // the mocked factory can invoke the factory factory + Mock.Get(mockedFactory) + .Setup(x => x.GetInstance(typeof(IFactory))) + .Returns(() => factoryFactory?.Invoke(mockedFactory)); + + var logger = new ProfilingLogger(Mock.Of(), Mock.Of()); + var typeLoader = new TypeLoader(Mock.Of(), "", logger); + var composition = new Composition(mockedRegister, typeLoader, logger, Mock.Of()); + + // create the factory, ensure it is the mocked factory + var factory = composition.CreateFactory(); + Assert.AreSame(mockedFactory, factory); + + // ensure we can get an IFactory instance, + // meaning that it has been properly registered + + var resolved = factory.GetInstance(); + Assert.IsNotNull(resolved); + Assert.AreSame(factory, resolved); + } + } +} diff --git a/src/Umbraco.Tests/Umbraco.Tests.csproj b/src/Umbraco.Tests/Umbraco.Tests.csproj index 20cea53b09..e0622f0c27 100644 --- a/src/Umbraco.Tests/Umbraco.Tests.csproj +++ b/src/Umbraco.Tests/Umbraco.Tests.csproj @@ -118,6 +118,7 @@ +