/// <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); }
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); }
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)); }
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))); }
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); }