From 97a0f149a3369da8e3fd79895abd61e242e7fc84 Mon Sep 17 00:00:00 2001 From: NGloreous Date: Sat, 18 Oct 2014 22:06:15 -0700 Subject: [PATCH] SetupAllProperties doesn't setup properties that don't have setter SetupAllProperties doesn't setup properties that only have a get. This is a regression from previous behavior and this change fixes the issue. --- Source/Mock.cs | 27 ++++++++++++++++++++++----- UnitTests/StubExtensionsFixture.cs | 9 ++++++++- 2 files changed, 30 insertions(+), 6 deletions(-) diff --git a/Source/Mock.cs b/Source/Mock.cs index 50fda3a6f..066e6948a 100644 --- a/Source/Mock.cs +++ b/Source/Mock.cs @@ -665,13 +665,15 @@ internal static void SetupAllProperties(Mock mock) var properties = mockType.GetProperties() .Concat(mockType.GetInterfaces().SelectMany(i => i.GetProperties())) .Where(p => - p.CanRead && p.CanWrite && + p.CanRead && p.CanOverrideGet() && p.GetIndexParameters().Length == 0 && - p.CanOverrideGet() && p.CanOverrideSet()) + !(p.CanWrite ^ (p.CanWrite & p.CanOverrideSet()))) .Distinct(); - var method = mock.GetType().GetMethods() + var setupPropertyMethod = mock.GetType().GetMethods() .First(m => m.Name == "SetupProperty" && m.GetParameters().Length == 2); + var setupGetMethod = mock.GetType().GetMethods() + .First(m => m.Name == "SetupGet" && m.GetParameters().Length == 1); foreach (var property in properties) { @@ -684,8 +686,23 @@ internal static void SetupAllProperties(Mock mock) SetupAllProperties(mocked.Mock); } - method.MakeGenericMethod(property.PropertyType) - .Invoke(mock, new[] { expression, initialValue }); + if (property.CanWrite) + { + setupPropertyMethod.MakeGenericMethod(property.PropertyType) + .Invoke(mock, new[] { expression, initialValue }); + } + else + { + var genericSetupGetMethod = setupGetMethod.MakeGenericMethod(property.PropertyType); + var returnsMethod = + genericSetupGetMethod + .ReturnType + .GetInterface("IReturnsGetter`2", ignoreCase: false) + .GetMethod("Returns", new Type[] { property.PropertyType }); + + var returnsGetter = genericSetupGetMethod.Invoke(mock, new[] { expression }); + returnsMethod.Invoke(returnsGetter, new[] { initialValue }); + } } }); } diff --git a/UnitTests/StubExtensionsFixture.cs b/UnitTests/StubExtensionsFixture.cs index 58265b1ca..8ae49b081 100644 --- a/UnitTests/StubExtensionsFixture.cs +++ b/UnitTests/StubExtensionsFixture.cs @@ -36,10 +36,16 @@ public void ShouldStubPropertyWithInitialValue() [Fact] public void StubsAllProperties() { - var mock = new Mock(); + var mock = new Mock(MockBehavior.Strict); mock.SetupAllProperties(); + // Verify defaults + Assert.Equal(default(int), mock.Object.ValueProperty); + Assert.Equal(null, mock.Object.Object); + Assert.Equal(null, mock.Object.Bar); + Assert.Equal(null, mock.Object.GetOnly); + mock.Object.ValueProperty = 5; Assert.Equal(5, mock.Object.ValueProperty); @@ -98,6 +104,7 @@ public interface IFoo int ValueProperty { get; set; } object Object { get; set; } IBar Bar { get; set; } + object GetOnly { get; } } public class Derived : Base