Пример #1
0
        /// <summary>
        /// Create a mock <see cref="DefaultModelMetadata"/> to be used in place of the mock model binding.
        /// </summary>
        /// <remarks>Bare minimum required to make model binding function. Not necessarily correct.</remarks>
        /// <returns>A Default Model Metadata object.</returns>
        private DefaultModelMetadata MockDefaultModelMetadata()
        {
            var memberInfo = new Mock <MemberInfo>(MockBehavior.Strict);

            memberInfo.Setup(mi => mi.MemberType).Returns(MemberTypes.Method);
            memberInfo.Setup(mi => mi.DeclaringType).Returns(typeof(object));

            var parameterInfo = new Mock <ParameterInfo>(MockBehavior.Strict);

            parameterInfo.Setup(pi => pi.Name).Returns("name");
            parameterInfo.Setup(pi => pi.ParameterType).Returns(typeof(object));
            parameterInfo.Setup(pi => pi.Member).Returns(memberInfo.Object);

            var attributes = new Attribute[]
            {
                new ExaminationValidationModelBinderContextAttribute("expectedParameterName"),
            };

            // ReSharper disable once CoVariantArrayConversion
            parameterInfo.Setup(pi => pi.GetCustomAttributes(typeof(Attribute), false)).Returns(attributes);

            var modelAttributes = ModelAttributes.GetAttributesForParameter(parameterInfo.Object);

            var provider             = new Mock <IModelMetadataProvider>(MockBehavior.Strict);
            var detailsProvider      = new Mock <ICompositeMetadataDetailsProvider>(MockBehavior.Strict);
            var modelMetadataDetails = new DefaultMetadataDetails(ModelMetadataIdentity.ForType(typeof(object)), modelAttributes);

            var modelMetadata = new DefaultModelMetadata(provider.Object, detailsProvider.Object, modelMetadataDetails);

            return(modelMetadata);
        }
Пример #2
0
    public void GetAttributesForParameter_NoAttributes()
    {
        // Arrange & Act
        var attributes = ModelAttributes.GetAttributesForParameter(
            typeof(MethodWithParamAttributesType)
            .GetMethod(nameof(MethodWithParamAttributesType.Method))
            .GetParameters()[0]);

        // Assert
        // Not exactly "no attributes" due to SerializableAttribute on object.
        Assert.IsType <SerializableAttribute>(Assert.Single(attributes.Attributes));
        Assert.Empty(attributes.ParameterAttributes);
        Assert.Null(attributes.PropertyAttributes);
        Assert.Equal(attributes.Attributes, attributes.TypeAttributes);
    }
Пример #3
0
    public void GetAttributesForParameter_IncludesTypeAttributes()
    {
        // Arrange
        var parameters = typeof(MethodWithParamAttributesType)
                         .GetMethod(nameof(MethodWithParamAttributesType.Method))
                         .GetParameters();

        // Act
        var attributes = ModelAttributes.GetAttributesForParameter(parameters[2]);

        // Assert
        Assert.Collection(attributes.Attributes,
                          attribute => Assert.IsType <BindRequiredAttribute>(attribute),
                          attribute => Assert.IsType <ClassValidator>(attribute));
        Assert.IsType <BindRequiredAttribute>(Assert.Single(attributes.ParameterAttributes));
        Assert.Null(attributes.PropertyAttributes);
        Assert.IsType <ClassValidator>(Assert.Single(attributes.TypeAttributes));
    }
Пример #4
0
    public void GetAttributesForParameter_SomeAttributes()
    {
        // Arrange & Act
        var attributes = ModelAttributes.GetAttributesForParameter(
            typeof(MethodWithParamAttributesType)
            .GetMethod(nameof(MethodWithParamAttributesType.Method))
            .GetParameters()[1]);

        // Assert
        Assert.Collection(
            // Take(2) to ignore ComVisibleAttribute, SerializableAttribute, ... on int.
            attributes.Attributes.Take(2),
            attribute => Assert.IsType <RequiredAttribute>(attribute),
            attribute => Assert.IsType <RangeAttribute>(attribute));
        Assert.Collection(
            attributes.ParameterAttributes,
            attribute => Assert.IsType <RequiredAttribute>(attribute),
            attribute => Assert.IsType <RangeAttribute>(attribute));
        Assert.Null(attributes.PropertyAttributes);
        Assert.Collection(
            // Take(1) because the attribute or attributes after SerializableAttribute are framework-specific.
            attributes.TypeAttributes.Take(1),
            attribute => Assert.IsType <SerializableAttribute>(attribute));
    }
 protected virtual DefaultMetadataDetails CreateParameterDetails(ModelMetadataIdentity key)
 {
     return(new DefaultMetadataDetails(
                key,
                ModelAttributes.GetAttributesForParameter(key.ParameterInfo)));
 }
Пример #6
0
        private IModelBinder GetBinder(ModelMetadata modelMetadata)
        {
            dynamic identity         = typeof(ModelMetadata).GetProperty("Identity", BindingFlags.Public | BindingFlags.Instance | BindingFlags.NonPublic).GetValue(modelMetadata);
            var     key              = ModelMetadataIdentity.ForParameter(identity.ParameterInfo, modelMetadata.ModelType);
            var     newModelMetadata = new DefaultModelMetadata(_modelMetadataProvider, _detailsProvider, new DefaultMetadataDetails(key, ModelAttributes.GetAttributesForParameter(identity.ParameterInfo, modelMetadata.ModelType)), _modelBindingMessageProvider);

            newModelMetadata.BindingMetadata.BinderType = null;

            var factoryContext = new ModelBinderFactoryContext()
            {
                Metadata    = newModelMetadata,
                BindingInfo = new BindingInfo()
                {
                    BinderModelName        = newModelMetadata.BinderModelName,
                    BinderType             = newModelMetadata.BinderType,
                    BindingSource          = newModelMetadata.BindingSource,
                    PropertyFilterProvider = newModelMetadata.PropertyFilterProvider,
                },

                CacheToken = null,
            };

            var binder = _modelBinderFactory.CreateBinder(factoryContext);

            return(binder);
        }