diff --git a/Moq.AutoMock.Tests/Resolvers/SelfResolverTests.cs b/Moq.AutoMock.Tests/Resolvers/SelfResolverTests.cs index 02b16f0..105fad6 100644 --- a/Moq.AutoMock.Tests/Resolvers/SelfResolverTests.cs +++ b/Moq.AutoMock.Tests/Resolvers/SelfResolverTests.cs @@ -26,4 +26,15 @@ public void WhenRequestTypeIsIServiceProviderThenResolvesToAutoMockerInstance() Assert.IsTrue(context.ValueProvided); Assert.AreSame(mocker, context.Value); } + + [TestMethod] + [Description("Issue 450")] + public void WhenServiceProviderIsRequestedAsMockThenItReturnsMockedServiceProvider() + { + var mocker = new AutoMocker(); + + var serviceProvider = mocker.GetMock(); + + Assert.IsNotNull(serviceProvider); + } } diff --git a/Moq.AutoMock/AutoMocker.cs b/Moq.AutoMock/AutoMocker.cs index ff9192e..7b7f62b 100644 --- a/Moq.AutoMock/AutoMocker.cs +++ b/Moq.AutoMock/AutoMocker.cs @@ -784,7 +784,7 @@ public Mock GetMock(Type serviceType, bool enablePrivate) private Mock GetMockImplementation(Type serviceType, bool enablePrivate) { - if (TryResolve(serviceType, new ObjectGraphContext(enablePrivate), out IInstance? instance, out bool noCache) && + if (TryResolve(serviceType, new ObjectGraphContext(enablePrivate, isMockCreation:true), out IInstance? instance, out bool noCache) && instance.IsMock) { if (!noCache && TypeMap is { } typeMap && !typeMap.ContainsKey(serviceType)) diff --git a/Moq.AutoMock/ObjectGraphContext.cs b/Moq.AutoMock/ObjectGraphContext.cs index 81840d4..ce6ee9e 100644 --- a/Moq.AutoMock/ObjectGraphContext.cs +++ b/Moq.AutoMock/ObjectGraphContext.cs @@ -12,13 +12,24 @@ public class ObjectGraphContext /// /// Creates an instance with binding flags set according to `enablePrivate`. /// - /// + /// Enable private members public ObjectGraphContext(bool enablePrivate) { BindingFlags = GetBindingFlags(enablePrivate); VisitedTypes = []; } + /// + /// Creates an instance with binding flags set according to `enablePrivate`. + /// + /// Enable private members + /// Indicates if the object is for a mock instance. + public ObjectGraphContext(bool enablePrivate, bool isMockCreation) + : this(enablePrivate) + { + IsMockCreation = isMockCreation; + } + /// /// Creates a new instance, copying the values for the Binding flags and the Visited types. /// @@ -46,6 +57,12 @@ public ObjectGraphContext(ObjectGraphContext context, ParameterInfo targetParame ParameterInfo = targetParameter ?? throw new ArgumentNullException(nameof(targetParameter)); } + /// + /// Indicates if the requested operation is for creating a Mock instance. + /// This will will only be true for types requested through AutoMocker.GetMock methods. + /// + public bool IsMockCreation { get; } + /// /// Flags passed to Mock constructor. /// diff --git a/Moq.AutoMock/Resolvers/SelfResolver.cs b/Moq.AutoMock/Resolvers/SelfResolver.cs index 6603850..df777be 100644 --- a/Moq.AutoMock/Resolvers/SelfResolver.cs +++ b/Moq.AutoMock/Resolvers/SelfResolver.cs @@ -6,6 +6,16 @@ public class SelfResolver : SimpleTypeResolver { /// - protected override AutoMocker GetValue(MockResolutionContext context) + public override void Resolve(MockResolutionContext context) + { + if (context.ObjectGraphContext.IsMockCreation) + { + return; + } + base.Resolve(context); + } + + /// + protected override AutoMocker GetValue(MockResolutionContext context) => context.AutoMocker; } diff --git a/Moq.AutoMock/Resolvers/SimpleTypeResolver.cs b/Moq.AutoMock/Resolvers/SimpleTypeResolver.cs index 608f08f..e07837f 100644 --- a/Moq.AutoMock/Resolvers/SimpleTypeResolver.cs +++ b/Moq.AutoMock/Resolvers/SimpleTypeResolver.cs @@ -19,7 +19,7 @@ public abstract class SimpleTypeResolver : IMockResolver protected bool IncludeInterfaces { get; set; } = true; /// - public void Resolve(MockResolutionContext context) + public virtual void Resolve(MockResolutionContext context) { if (context.RequestType == typeof(T) || (IncludeBaseTypes && typeof(T).IsAssignableFrom(context.RequestType)) ||