Skip to content

Commit 0f649a4

Browse files
authored
CreateSelfMock should cache dependencies it creates (#131)
1 parent d4bc4dd commit 0f649a4

File tree

2 files changed

+47
-28
lines changed

2 files changed

+47
-28
lines changed
Lines changed: 44 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,44 @@
1-
using Microsoft.VisualStudio.TestTools.UnitTesting;
2-
using Moq.AutoMock.Tests.Util;
3-
4-
namespace Moq.AutoMock.Tests
5-
{
6-
[TestClass]
7-
public class DescribeCreatingSelfMocks
8-
{
9-
[TestMethod]
10-
public void Self_mocks_are_useful_for_testing_most_of_class()
11-
{
12-
var mocker = new AutoMocker();
13-
var selfMock = mocker.CreateSelfMock<InsecureAboutSelf>();
14-
selfMock.TellJoke();
15-
Assert.IsFalse(selfMock.SelfDepricated);
16-
}
17-
18-
[TestMethod]
19-
public void It_can_self_mock_objects_with_constructor_arguments()
20-
{
21-
var mocker = new AutoMocker();
22-
var selfMock = mocker.CreateSelfMock<WithService>();
23-
Assert.IsNotNull(selfMock.Service);
24-
Assert.IsNotNull(Mock.Get(selfMock.Service));
25-
}
26-
}
27-
}
1+
using Microsoft.VisualStudio.TestTools.UnitTesting;
2+
using Moq.AutoMock.Tests.Util;
3+
4+
namespace Moq.AutoMock.Tests
5+
{
6+
[TestClass]
7+
public class DescribeCreatingSelfMocks
8+
{
9+
[TestMethod]
10+
public void Self_mocks_are_useful_for_testing_most_of_class()
11+
{
12+
var mocker = new AutoMocker();
13+
var selfMock = mocker.CreateSelfMock<InsecureAboutSelf>();
14+
selfMock.TellJoke();
15+
Assert.IsFalse(selfMock.SelfDepricated);
16+
}
17+
18+
[TestMethod]
19+
public void It_can_self_mock_objects_with_constructor_arguments()
20+
{
21+
var mocker = new AutoMocker();
22+
var selfMock = mocker.CreateSelfMock<WithService>();
23+
Assert.IsNotNull(selfMock.Service);
24+
Assert.IsNotNull(Mock.Get(selfMock.Service));
25+
}
26+
27+
[TestMethod]
28+
[Description("Issue 130")]
29+
public void It_reuses_dependencies_when_creating_self_mock()
30+
{
31+
var mocker = new AutoMocker();
32+
var service = mocker.CreateSelfMock<AbstractService>();
33+
Assert.IsTrue(ReferenceEquals(service.Dependency, mocker.GetMock<IDependency>().Object));
34+
}
35+
36+
public abstract class AbstractService
37+
{
38+
public IDependency Dependency { get; }
39+
public AbstractService(IDependency dependency) => Dependency = dependency;
40+
}
41+
42+
public interface IDependency { }
43+
}
44+
}

Moq.AutoMock/AutoMocker.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -246,12 +246,14 @@ public T CreateSelfMock<T>() where T : class?
246246
public T CreateSelfMock<T>(bool enablePrivate) where T : class?
247247
{
248248
var context = new ObjectGraphContext(enablePrivate);
249-
if (!TryGetConstructorInvocation(typeof(T), context, out _, out IInstance[]? arguments))
249+
if (!TryGetConstructorInvocation(typeof(T), context, out ConstructorInfo? ctor, out IInstance[]? arguments))
250250
{
251251
throw new ArgumentException(
252252
$"Did not find a best constructor for `{typeof(T)}`. If your type has a non-public constructor, set the 'enablePrivate' parameter to true for this {nameof(AutoMocker)} method.");
253253
}
254254

255+
CacheInstances(arguments.Zip(ctor.GetParameters(), (i, p) => (p.ParameterType, i)));
256+
255257
var mock = new Mock<T>(MockBehavior, arguments.Select(x => x.Value).ToArray())
256258
{
257259
DefaultValue = DefaultValue,

0 commit comments

Comments
 (0)