예제 #1
0
        private static readonly int AccessorPrefixLength = "?et_".Length;         // get_ or set_

        public static bool Handle(Invocation invocation, Mock mock)
        {
            if (mock.AutoSetupPropertiesDefaultValueProvider == null)
            {
                return(false);
            }

            MethodInfo invocationMethod = invocation.Method;

            if (invocationMethod.IsPropertyAccessor() && !invocationMethod.IsPropertyIndexerAccessor())
            {
                string       propertyNameToSearch = invocationMethod.Name.Substring(AccessorPrefixLength);
                PropertyInfo property             = invocationMethod.DeclaringType.GetProperty(propertyNameToSearch);

                if (property == null)
                {
                    return(false);
                }

                var expression = GetPropertyExpression(invocationMethod.DeclaringType, property);

                object propertyValue;

                Setup getterSetup = null;
                if (property.CanRead)
                {
                    var getter = property.GetGetMethod(true);
                    propertyValue = CreateInitialPropertyValue(mock, getter);
                    getterSetup   = new AutoImplementedPropertyGetterSetup(expression, getter, () => propertyValue);
                    mock.Setups.Add(getterSetup);
                }

                Setup setterSetup = null;
                if (property.CanWrite)
                {
                    MethodInfo setter = property.GetSetMethod(nonPublic: true);
                    setterSetup = new AutoImplementedPropertySetterSetup(expression, setter, (newValue) =>
                    {
                        propertyValue = newValue;
                    });
                    mock.Setups.Add(setterSetup);
                }

                Setup setupToExecute = invocationMethod.IsPropertyGetter() ? getterSetup : setterSetup;
                setupToExecute.Execute(invocation);

                return(true);
            }
            else
            {
                return(false);
            }
        }
예제 #2
0
        private static readonly int AccessorPrefixLength = "?et_".Length;         // get_ or set_

        public static bool Handle(Invocation invocation, Mock mock)
        {
            if (mock.AutoSetupPropertiesDefaultValueProvider == null)
            {
                return(false);
            }

            MethodInfo invocationMethod = invocation.Method;

            if (invocationMethod.IsPropertyAccessor())
            {
                string       propertyNameToSearch = invocationMethod.Name.Substring(AccessorPrefixLength);
                PropertyInfo property             = invocationMethod.DeclaringType.GetProperty(propertyNameToSearch);

                if (property == null)
                {
                    return(false);
                }

                var expression = GetPropertyExpression(invocationMethod.DeclaringType, property);

                object propertyValue;

                Setup getterSetup = null;
                if (property.CanRead(out var getter))
                {
                    if (ProxyFactory.Instance.IsMethodVisible(getter, out _))
                    {
                        propertyValue = CreateInitialPropertyValue(mock, getter);
                        getterSetup   = new AutoImplementedPropertyGetterSetup(mock, expression, getter, () => propertyValue);
                        mock.MutableSetups.Add(getterSetup);
                    }

                    // If we wanted to optimise for speed, we'd probably be forgiven
                    // for removing the above `IsMethodVisible` guard, as it's rather
                    // unlikely to encounter non-public getters such as the following
                    // in real-world code:
                    //
                    //     public T Property { internal get; set; }
                    //
                    // Usually, it's only the setters that are made non-public. For
                    // now however, we prefer correctness.
                }

                Setup setterSetup = null;
                if (property.CanWrite(out var setter))
                {
                    if (ProxyFactory.Instance.IsMethodVisible(setter, out _))
                    {
                        setterSetup = new AutoImplementedPropertySetterSetup(mock, expression, setter, (newValue) =>
                        {
                            propertyValue = newValue;
                        });
                        mock.MutableSetups.Add(setterSetup);
                    }
                }

                Setup setupToExecute = invocationMethod.IsGetAccessor() ? getterSetup : setterSetup;
                setupToExecute.Execute(invocation);

                return(true);
            }
            else
            {
                return(false);
            }
        }