public void GetBinderReturnsFirstBinderFromProviders() { // Arrange ControllerContext controllerContext = new ControllerContext(); ExtensibleModelBindingContext bindingContext = new ExtensibleModelBindingContext() { ModelMetadata = new EmptyModelMetadataProvider().GetMetadataForType(null, typeof(object)) }; IExtensibleModelBinder expectedBinder = new Mock <IExtensibleModelBinder>().Object; Mock <ModelBinderProvider> mockProvider = new Mock <ModelBinderProvider>(); mockProvider.Setup(p => p.GetBinder(controllerContext, bindingContext)).Returns(expectedBinder); ModelBinderProviderCollection collection = new ModelBinderProviderCollection(new ModelBinderProvider[] { new Mock <ModelBinderProvider>().Object, mockProvider.Object, new Mock <ModelBinderProvider>().Object }); // Act IExtensibleModelBinder returned = collection.GetBinder(controllerContext, bindingContext); // Assert Assert.AreEqual(expectedBinder, returned); }
public void BindModel_UnsuccessfulBind_SimpleTypeNoFallback_ReturnsNull() { // Arrange ControllerContext controllerContext = GetControllerContext(); Mock <ModelBinderProvider> mockBinderProvider = new Mock <ModelBinderProvider>(); mockBinderProvider.Setup(o => o.GetBinder(controllerContext, It.IsAny <ExtensibleModelBindingContext>())).Returns((IExtensibleModelBinder)null).Verifiable(); ModelBinderProviderCollection binderProviders = new ModelBinderProviderCollection() { mockBinderProvider.Object }; ExtensibleModelBinderAdapter shimBinder = new ExtensibleModelBinderAdapter(binderProviders); ModelBindingContext bindingContext = new ModelBindingContext() { FallbackToEmptyPrefix = true, ModelMetadata = new DataAnnotationsModelMetadataProvider().GetMetadataForType(null, typeof(int)), ModelState = controllerContext.Controller.ViewData.ModelState }; // Act object retVal = shimBinder.BindModel(controllerContext, bindingContext); // Assert Assert.IsNull(retVal); Assert.IsTrue(bindingContext.ModelState.IsValid, "No errors should have been added to ModelState."); mockBinderProvider.Verify(); mockBinderProvider.Verify(o => o.GetBinder(controllerContext, It.IsAny <ExtensibleModelBindingContext>()), Times.AtMostOnce()); }
public void BindModel_PropertyFilterIsSet_Throws() { // Arrange ControllerContext controllerContext = GetControllerContext(); ModelBindingContext bindingContext = new ModelBindingContext() { FallbackToEmptyPrefix = true, ModelMetadata = new DataAnnotationsModelMetadataProvider().GetMetadataForType(null, typeof(SimpleModel)), PropertyFilter = (new BindAttribute() { Include = "FirstName " }).IsPropertyAllowed }; ModelBinderProviderCollection binderProviders = new ModelBinderProviderCollection(); ExtensibleModelBinderAdapter shimBinder = new ExtensibleModelBinderAdapter(binderProviders); // Act & assert ExceptionHelper.ExpectInvalidOperationException( delegate { shimBinder.BindModel(controllerContext, bindingContext); }, @"The new model binding system cannot be used when a property whitelist or blacklist has been specified in [Bind] or via the call to UpdateModel() / TryUpdateModel(). Use the [BindRequired] and [BindNever] attributes on the model type or its properties instead."); }
public void BindModel_UnsuccessfulBind_BinderFails_ReturnsNull() { // Arrange ControllerContext controllerContext = GetControllerContext(); Mock <IExtensibleModelBinder> mockListBinder = new Mock <IExtensibleModelBinder>(); mockListBinder.Setup(o => o.BindModel(controllerContext, It.IsAny <ExtensibleModelBindingContext>())).Returns(false).Verifiable(); ModelBinderProviderCollection binderProviders = new ModelBinderProviderCollection(); binderProviders.RegisterBinderForType(typeof(List <int>), mockListBinder.Object, true /* suppressPrefixCheck */); ExtensibleModelBinderAdapter shimBinder = new ExtensibleModelBinderAdapter(binderProviders); ModelBindingContext bindingContext = new ModelBindingContext() { FallbackToEmptyPrefix = false, ModelMetadata = new EmptyModelMetadataProvider().GetMetadataForType(null, typeof(List <int>)), ModelState = controllerContext.Controller.ViewData.ModelState }; // Act object retVal = shimBinder.BindModel(controllerContext, bindingContext); // Assert Assert.IsNull(retVal); Assert.IsTrue(bindingContext.ModelState.IsValid, "No errors should have been added to ModelState."); mockListBinder.Verify(); }
public void DefaultConstructor() { // Act ModelBinderProviderCollection collection = new ModelBinderProviderCollection(); // Assert Assert.AreEqual(0, collection.Count); }
public void GetBinderThrowsIfControllerContextIsNull() { // Arrange ModelBinderProviderCollection collection = new ModelBinderProviderCollection(); // Act & assert ExceptionHelper.ExpectArgumentNullException( delegate { collection.GetBinder(null, new ExtensibleModelBindingContext()); }, "controllerContext"); }
public void AddNullProviderThrows() { // Arrange ModelBinderProviderCollection collection = new ModelBinderProviderCollection(); // Act & Assert ExceptionHelper.ExpectArgumentNullException( delegate { collection.Add(null); }, "item"); }
public void BindModel_SuccessfulBind_ComplexTypeFallback_RunsValidationAndReturnsModel() { // Arrange ControllerContext controllerContext = GetControllerContext(); bool validationCalled = false; List <int> expectedModel = new List <int>() { 1, 2, 3, 4, 5 }; ModelBindingContext bindingContext = new ModelBindingContext() { FallbackToEmptyPrefix = true, ModelMetadata = new DataAnnotationsModelMetadataProvider().GetMetadataForType(null, typeof(List <int>)), ModelName = "someName", ModelState = controllerContext.Controller.ViewData.ModelState, PropertyFilter = _ => true, ValueProvider = new SimpleValueProvider() { { "someOtherName", "dummyValue" } } }; Mock <IExtensibleModelBinder> mockIntBinder = new Mock <IExtensibleModelBinder>(); mockIntBinder .Setup(o => o.BindModel(controllerContext, It.IsAny <ExtensibleModelBindingContext>())) .Returns( delegate(ControllerContext cc, ExtensibleModelBindingContext mbc) { Assert.AreSame(bindingContext.ModelMetadata, mbc.ModelMetadata, "ModelMetadata wasn't correct."); Assert.AreEqual("", mbc.ModelName, "ModelName wasn't correct."); Assert.AreSame(bindingContext.ValueProvider, mbc.ValueProvider, "ValueProvider wasn't correct."); mbc.Model = expectedModel; mbc.ValidationNode.Validating += delegate { validationCalled = true; }; return(true); }); ModelBinderProviderCollection binderProviders = new ModelBinderProviderCollection(); binderProviders.RegisterBinderForType(typeof(List <int>), mockIntBinder.Object, false /* suppressPrefixCheck */); ExtensibleModelBinderAdapter shimBinder = new ExtensibleModelBinderAdapter(binderProviders); // Act object retVal = shimBinder.BindModel(controllerContext, bindingContext); // Assert Assert.AreEqual(expectedModel, retVal); Assert.IsTrue(validationCalled); Assert.IsTrue(bindingContext.ModelState.IsValid, "No errors should have been added to ModelState."); }
public void SetNullProviderThrows() { // Arrange ModelBinderProviderCollection collection = new ModelBinderProviderCollection(); collection.Add(new Mock <ModelBinderProvider>().Object); // Act & Assert ExceptionHelper.ExpectArgumentNullException( delegate { collection[0] = null; }, "item"); }
public void ListWrappingConstructor() { // Arrange ModelBinderProvider[] providers = new ModelBinderProvider[] { new Mock <ModelBinderProvider>().Object, new Mock <ModelBinderProvider>().Object }; // Act ModelBinderProviderCollection collection = new ModelBinderProviderCollection(providers); // Assert CollectionAssert.AreEqual(providers, collection); }
public void Initialize_ReplacesOriginalCollection() { // Arrange ModelBinderDictionary oldBinders = new ModelBinderDictionary(); oldBinders[typeof(int)] = new Mock<IModelBinder>().Object; ModelBinderProviderCollection newBinderProviders = new ModelBinderProviderCollection(); // Act ModelBinderConfig.Initialize(oldBinders, newBinderProviders); // Assert Assert.AreEqual(0, oldBinders.Count, "Old binder dictionary should have been cleared."); ExtensibleModelBinderAdapter shimBinder = oldBinders.DefaultBinder as ExtensibleModelBinderAdapter; Assert.IsNotNull(shimBinder, "The default binder for the old system should have been replaced with a compatibility shim."); Assert.AreSame(newBinderProviders, shimBinder.Providers, "Providers collection was not passed through correctly."); }
public void GetBinderThrowsIfModelTypeHasBindAttribute() { // Arrange ControllerContext controllerContext = new ControllerContext(); ExtensibleModelBindingContext bindingContext = new ExtensibleModelBindingContext() { ModelMetadata = new EmptyModelMetadataProvider().GetMetadataForType(null, typeof(ModelWithBindAttribute)) }; ModelBinderProviderCollection collection = new ModelBinderProviderCollection(); // Act & assert ExceptionHelper.ExpectInvalidOperationException( delegate { collection.GetBinder(controllerContext, bindingContext); }, @"The model of type 'Microsoft.Web.Mvc.ModelBinding.Test.ModelBinderProviderCollectionTest+ModelWithBindAttribute' has a [Bind] attribute. The new model binding system cannot be used with models that have type-level [Bind] attributes. Use the [BindRequired] and [BindNever] attributes on the model type or its properties instead."); }
public void GetBinder_FromAttribute_BadAttribute_Throws() { // Arrange ControllerContext controllerContext = new ControllerContext(); ExtensibleModelBindingContext bindingContext = new ExtensibleModelBindingContext() { ModelMetadata = new EmptyModelMetadataProvider().GetMetadataForType(null, typeof(ModelWithProviderAttribute_BadAttribute)) }; ModelBinderProviderCollection providers = new ModelBinderProviderCollection(); // Act & assert ExceptionHelper.ExpectInvalidOperationException( delegate { providers.GetBinder(controllerContext, bindingContext); }, @"The type 'System.Object' does not subclass Microsoft.Web.Mvc.ModelBinding.ModelBinderProvider or implement the interface Microsoft.Web.Mvc.ModelBinding.IExtensibleModelBinder."); }
public void SetItem() { // Arrange ModelBinderProvider provider0 = new Mock <ModelBinderProvider>().Object; ModelBinderProvider provider1 = new Mock <ModelBinderProvider>().Object; ModelBinderProvider provider2 = new Mock <ModelBinderProvider>().Object; ModelBinderProviderCollection collection = new ModelBinderProviderCollection(); collection.Add(provider0); collection.Add(provider1); // Act collection[1] = provider2; // Assert CollectionAssert.AreEqual(new ModelBinderProvider[] { provider0, provider2 }, collection); }
public void Initialize_ReplacesOriginalCollection() { // Arrange ModelBinderDictionary oldBinders = new ModelBinderDictionary(); oldBinders[typeof(int)] = new Mock <IModelBinder>().Object; ModelBinderProviderCollection newBinderProviders = new ModelBinderProviderCollection(); // Act ModelBinderConfig.Initialize(oldBinders, newBinderProviders); // Assert Assert.AreEqual(0, oldBinders.Count, "Old binder dictionary should have been cleared."); ExtensibleModelBinderAdapter shimBinder = oldBinders.DefaultBinder as ExtensibleModelBinderAdapter; Assert.IsNotNull(shimBinder, "The default binder for the old system should have been replaced with a compatibility shim."); Assert.AreSame(newBinderProviders, shimBinder.Providers, "Providers collection was not passed through correctly."); }
public void GetBinderReturnsNullIfNoProviderMatches() { // Arrange ControllerContext controllerContext = new ControllerContext(); ExtensibleModelBindingContext bindingContext = new ExtensibleModelBindingContext() { ModelMetadata = new EmptyModelMetadataProvider().GetMetadataForType(null, typeof(object)) }; ModelBinderProviderCollection collection = new ModelBinderProviderCollection(new ModelBinderProvider[] { new Mock <ModelBinderProvider>().Object, }); // Act IExtensibleModelBinder returned = collection.GetBinder(controllerContext, bindingContext); // Assert Assert.IsNull(returned); }
public void GetBinder_FromAttribute_Provider_ReturnsBinder() { // Arrange ControllerContext controllerContext = new ControllerContext(); ExtensibleModelBindingContext bindingContext = new ExtensibleModelBindingContext() { ModelMetadata = new EmptyModelMetadataProvider().GetMetadataForType(null, typeof(ModelWithProviderAttribute_Provider)) }; ModelBinderProviderCollection providers = new ModelBinderProviderCollection(); providers.RegisterBinderForType(typeof(ModelWithProviderAttribute_Provider), new Mock <IExtensibleModelBinder>().Object, true /* suppressPrefix */); // Act IExtensibleModelBinder binder = providers.GetBinder(controllerContext, bindingContext); // Assert Assert.AreEqual(typeof(CustomBinder), binder.GetType(), "Binder should've come from attribute rather than collection."); }
public void BindModel_SuccessfulBind_RunsValidationAndReturnsModel() { // Arrange ControllerContext controllerContext = GetControllerContext(); bool validationCalled = false; ModelBindingContext bindingContext = new ModelBindingContext() { FallbackToEmptyPrefix = true, ModelMetadata = new DataAnnotationsModelMetadataProvider().GetMetadataForType(null, typeof(int)), ModelName = "someName", ModelState = controllerContext.Controller.ViewData.ModelState, PropertyFilter = _ => true, ValueProvider = new SimpleValueProvider() { { "someName", "dummyValue" } } }; Mock<IExtensibleModelBinder> mockIntBinder = new Mock<IExtensibleModelBinder>(); mockIntBinder .Setup(o => o.BindModel(controllerContext, It.IsAny<ExtensibleModelBindingContext>())) .Returns( delegate(ControllerContext cc, ExtensibleModelBindingContext mbc) { Assert.AreSame(bindingContext.ModelMetadata, mbc.ModelMetadata, "ModelMetadata wasn't correct."); Assert.AreEqual("someName", mbc.ModelName, "ModelName wasn't correct."); Assert.AreSame(bindingContext.ValueProvider, mbc.ValueProvider, "ValueProvider wasn't correct."); mbc.Model = 42; mbc.ValidationNode.Validating += delegate { validationCalled = true; }; return true; }); ModelBinderProviderCollection binderProviders = new ModelBinderProviderCollection(); binderProviders.RegisterBinderForType(typeof(int), mockIntBinder.Object, false /* suppressPrefixCheck */); ExtensibleModelBinderAdapter shimBinder = new ExtensibleModelBinderAdapter(binderProviders); // Act object retVal = shimBinder.BindModel(controllerContext, bindingContext); // Assert Assert.AreEqual(42, retVal); Assert.IsTrue(validationCalled); Assert.IsTrue(bindingContext.ModelState.IsValid, "No errors should have been added to ModelState."); }
public void BindModel_PropertyFilterIsSet_Throws() { // Arrange ControllerContext controllerContext = GetControllerContext(); ModelBindingContext bindingContext = new ModelBindingContext() { FallbackToEmptyPrefix = true, ModelMetadata = new DataAnnotationsModelMetadataProvider().GetMetadataForType(null, typeof(SimpleModel)), PropertyFilter = (new BindAttribute() { Include = "FirstName " }).IsPropertyAllowed }; ModelBinderProviderCollection binderProviders = new ModelBinderProviderCollection(); ExtensibleModelBinderAdapter shimBinder = new ExtensibleModelBinderAdapter(binderProviders); // Act & assert ExceptionHelper.ExpectInvalidOperationException( delegate { shimBinder.BindModel(controllerContext, bindingContext); }, @"The new model binding system cannot be used when a property whitelist or blacklist has been specified in [Bind] or via the call to UpdateModel() / TryUpdateModel(). Use the [BindRequired] and [BindNever] attributes on the model type or its properties instead."); }
public void GetRequiredBinderThrowsIfNoProviderMatches() { // Arrange ControllerContext controllerContext = new ControllerContext(); ExtensibleModelBindingContext bindingContext = new ExtensibleModelBindingContext() { ModelMetadata = new EmptyModelMetadataProvider().GetMetadataForType(null, typeof(int)) }; ModelBinderProviderCollection collection = new ModelBinderProviderCollection(new ModelBinderProvider[] { new Mock <ModelBinderProvider>().Object, }); // Act & assert ExceptionHelper.ExpectInvalidOperationException( delegate { collection.GetRequiredBinder(controllerContext, bindingContext); }, @"A binder for type System.Int32 could not be located."); }
public void RegisterBinderForType_Instance_InsertsNewProviderBehindFrontOfListProviders() { // Arrange ModelBinderProvider frontOfListProvider = new ProviderAtFront(); IExtensibleModelBinder mockBinder = new Mock <IExtensibleModelBinder>().Object; ModelBinderProviderCollection collection = new ModelBinderProviderCollection() { frontOfListProvider }; // Act collection.RegisterBinderForType(typeof(int), mockBinder); // Assert CollectionAssert.AreEqual( new Type[] { typeof(ProviderAtFront), typeof(SimpleModelBinderProvider) }, collection.Select(o => o.GetType()).ToArray(), "New provider should be inserted after any marked 'front of list'."); }
public void RegisterBinderForGenericType_Instance() { // Arrange ModelBinderProvider mockProvider = new Mock <ModelBinderProvider>().Object; IExtensibleModelBinder mockBinder = new Mock <IExtensibleModelBinder>().Object; ModelBinderProviderCollection collection = new ModelBinderProviderCollection() { mockProvider }; // Act collection.RegisterBinderForGenericType(typeof(List <>), mockBinder); // Assert GenericModelBinderProvider genericProvider = collection[0] as GenericModelBinderProvider; Assert.IsNotNull(genericProvider, "Generic provider should've been inserted at the front of the list."); Assert.AreEqual(typeof(List <>), genericProvider.ModelType); Assert.AreEqual(mockProvider, collection[1]); }
public void RegisterBinderForType_Instance() { // Arrange ModelBinderProvider mockProvider = new Mock <ModelBinderProvider>().Object; IExtensibleModelBinder mockBinder = new Mock <IExtensibleModelBinder>().Object; ModelBinderProviderCollection collection = new ModelBinderProviderCollection() { mockProvider }; // Act collection.RegisterBinderForType(typeof(int), mockBinder); // Assert SimpleModelBinderProvider simpleProvider = collection[0] as SimpleModelBinderProvider; Assert.IsNotNull(simpleProvider, "Simple provider should've been inserted at the front of the list."); Assert.AreEqual(typeof(int), simpleProvider.ModelType); Assert.AreEqual(mockProvider, collection[1]); }
public void GetBinder_FromAttribute_Binder_ValueNotPresent_ReturnsNull() { // Arrange ControllerContext controllerContext = new ControllerContext(); ExtensibleModelBindingContext bindingContext = new ExtensibleModelBindingContext() { ModelMetadata = new EmptyModelMetadataProvider().GetMetadataForType(null, typeof(ModelWithProviderAttribute_Binder)), ModelName = "foo", ValueProvider = new SimpleValueProvider() { { "bar", "barValue" } } }; ModelBinderProviderCollection providers = new ModelBinderProviderCollection(); providers.RegisterBinderForType(typeof(ModelWithProviderAttribute_Binder), new Mock <IExtensibleModelBinder>().Object, true /* suppressPrefix */); // Act IExtensibleModelBinder binder = providers.GetBinder(controllerContext, bindingContext); // Assert Assert.IsNull(binder, "Binder should've come from attribute rather than collection, even if the attribute's provider returns null."); }
public void BindModel() { // Arrange ControllerContext controllerContext = new ControllerContext(); MyModel model = new MyModel(); ModelMetadata modelMetadata = new EmptyModelMetadataProvider().GetMetadataForType(() => model, typeof(MyModel)); ComplexModelDto dto = new ComplexModelDto(modelMetadata, modelMetadata.Properties); Mock<IExtensibleModelBinder> mockStringBinder = new Mock<IExtensibleModelBinder>(); mockStringBinder .Setup(b => b.BindModel(controllerContext, It.IsAny<ExtensibleModelBindingContext>())) .Returns( delegate(ControllerContext cc, ExtensibleModelBindingContext mbc) { Assert.AreEqual(typeof(string), mbc.ModelType); Assert.AreEqual("theModel.StringProperty", mbc.ModelName); mbc.ValidationNode = new ModelValidationNode(mbc.ModelMetadata, "theModel.StringProperty"); mbc.Model = "someStringValue"; return true; }); Mock<IExtensibleModelBinder> mockIntBinder = new Mock<IExtensibleModelBinder>(); mockIntBinder .Setup(b => b.BindModel(controllerContext, It.IsAny<ExtensibleModelBindingContext>())) .Returns( delegate(ControllerContext cc, ExtensibleModelBindingContext mbc) { Assert.AreEqual(typeof(int), mbc.ModelType); Assert.AreEqual("theModel.IntProperty", mbc.ModelName); mbc.ValidationNode = new ModelValidationNode(mbc.ModelMetadata, "theModel.IntProperty"); mbc.Model = 42; return true; }); Mock<IExtensibleModelBinder> mockDateTimeBinder = new Mock<IExtensibleModelBinder>(); mockDateTimeBinder .Setup(b => b.BindModel(controllerContext, It.IsAny<ExtensibleModelBindingContext>())) .Returns( delegate(ControllerContext cc, ExtensibleModelBindingContext mbc) { Assert.AreEqual(typeof(DateTime), mbc.ModelType); Assert.AreEqual("theModel.DateTimeProperty", mbc.ModelName); return false; }); ModelBinderProviderCollection binders = new ModelBinderProviderCollection(); binders.RegisterBinderForType(typeof(string), mockStringBinder.Object, true /* suppressPrefixCheck */); binders.RegisterBinderForType(typeof(int), mockIntBinder.Object, true /* suppressPrefixCheck */); binders.RegisterBinderForType(typeof(DateTime), mockDateTimeBinder.Object, true /* suppressPrefixCheck */); ExtensibleModelBindingContext parentBindingContext = new ExtensibleModelBindingContext() { ModelMetadata = new EmptyModelMetadataProvider().GetMetadataForType(() => dto, typeof(ComplexModelDto)), ModelName = "theModel", ModelBinderProviders = binders }; ComplexModelDtoModelBinder binder = new ComplexModelDtoModelBinder(); // Act bool retVal = binder.BindModel(controllerContext, parentBindingContext); // Assert Assert.IsTrue(retVal); Assert.AreEqual(dto, parentBindingContext.Model, "The return model should have been the original DTO."); ComplexModelDtoResult stringDtoResult = dto.Results[dto.PropertyMetadata.Where(m => m.ModelType == typeof(string)).First()]; Assert.AreEqual("someStringValue", stringDtoResult.Model); Assert.AreEqual("theModel.StringProperty", stringDtoResult.ValidationNode.ModelStateKey); ComplexModelDtoResult intDtoResult = dto.Results[dto.PropertyMetadata.Where(m => m.ModelType == typeof(int)).First()]; Assert.AreEqual(42, intDtoResult.Model); Assert.AreEqual("theModel.IntProperty", intDtoResult.ValidationNode.ModelStateKey); ComplexModelDtoResult dateTimeDtoResult = dto.Results[dto.PropertyMetadata.Where(m => m.ModelType == typeof(DateTime)).First()]; Assert.IsNull(dateTimeDtoResult); }
public void BindModel_UnsuccessfulBind_SimpleTypeNoFallback_ReturnsNull() { // Arrange ControllerContext controllerContext = GetControllerContext(); Mock<ModelBinderProvider> mockBinderProvider = new Mock<ModelBinderProvider>(); mockBinderProvider.Setup(o => o.GetBinder(controllerContext, It.IsAny<ExtensibleModelBindingContext>())).Returns((IExtensibleModelBinder)null).Verifiable(); ModelBinderProviderCollection binderProviders = new ModelBinderProviderCollection() { mockBinderProvider.Object }; ExtensibleModelBinderAdapter shimBinder = new ExtensibleModelBinderAdapter(binderProviders); ModelBindingContext bindingContext = new ModelBindingContext() { FallbackToEmptyPrefix = true, ModelMetadata = new DataAnnotationsModelMetadataProvider().GetMetadataForType(null, typeof(int)), ModelState = controllerContext.Controller.ViewData.ModelState }; // Act object retVal = shimBinder.BindModel(controllerContext, bindingContext); // Assert Assert.IsNull(retVal); Assert.IsTrue(bindingContext.ModelState.IsValid, "No errors should have been added to ModelState."); mockBinderProvider.Verify(); mockBinderProvider.Verify(o => o.GetBinder(controllerContext, It.IsAny<ExtensibleModelBindingContext>()), Times.AtMostOnce()); }
public void BindModel_UnsuccessfulBind_BinderFails_ReturnsNull() { // Arrange ControllerContext controllerContext = GetControllerContext(); Mock<IExtensibleModelBinder> mockListBinder = new Mock<IExtensibleModelBinder>(); mockListBinder.Setup(o => o.BindModel(controllerContext, It.IsAny<ExtensibleModelBindingContext>())).Returns(false).Verifiable(); ModelBinderProviderCollection binderProviders = new ModelBinderProviderCollection(); binderProviders.RegisterBinderForType(typeof(List<int>), mockListBinder.Object, true /* suppressPrefixCheck */); ExtensibleModelBinderAdapter shimBinder = new ExtensibleModelBinderAdapter(binderProviders); ModelBindingContext bindingContext = new ModelBindingContext() { FallbackToEmptyPrefix = false, ModelMetadata = new EmptyModelMetadataProvider().GetMetadataForType(null, typeof(List<int>)), ModelState = controllerContext.Controller.ViewData.ModelState }; // Act object retVal = shimBinder.BindModel(controllerContext, bindingContext); // Assert Assert.IsNull(retVal); Assert.IsTrue(bindingContext.ModelState.IsValid, "No errors should have been added to ModelState."); mockListBinder.Verify(); }
public void BindModel() { // Arrange ControllerContext controllerContext = new ControllerContext(); MyModel model = new MyModel(); ModelMetadata modelMetadata = new EmptyModelMetadataProvider().GetMetadataForType(() => model, typeof(MyModel)); ComplexModelDto dto = new ComplexModelDto(modelMetadata, modelMetadata.Properties); Mock <IExtensibleModelBinder> mockStringBinder = new Mock <IExtensibleModelBinder>(); mockStringBinder .Setup(b => b.BindModel(controllerContext, It.IsAny <ExtensibleModelBindingContext>())) .Returns( delegate(ControllerContext cc, ExtensibleModelBindingContext mbc) { Assert.AreEqual(typeof(string), mbc.ModelType); Assert.AreEqual("theModel.StringProperty", mbc.ModelName); mbc.ValidationNode = new ModelValidationNode(mbc.ModelMetadata, "theModel.StringProperty"); mbc.Model = "someStringValue"; return(true); }); Mock <IExtensibleModelBinder> mockIntBinder = new Mock <IExtensibleModelBinder>(); mockIntBinder .Setup(b => b.BindModel(controllerContext, It.IsAny <ExtensibleModelBindingContext>())) .Returns( delegate(ControllerContext cc, ExtensibleModelBindingContext mbc) { Assert.AreEqual(typeof(int), mbc.ModelType); Assert.AreEqual("theModel.IntProperty", mbc.ModelName); mbc.ValidationNode = new ModelValidationNode(mbc.ModelMetadata, "theModel.IntProperty"); mbc.Model = 42; return(true); }); Mock <IExtensibleModelBinder> mockDateTimeBinder = new Mock <IExtensibleModelBinder>(); mockDateTimeBinder .Setup(b => b.BindModel(controllerContext, It.IsAny <ExtensibleModelBindingContext>())) .Returns( delegate(ControllerContext cc, ExtensibleModelBindingContext mbc) { Assert.AreEqual(typeof(DateTime), mbc.ModelType); Assert.AreEqual("theModel.DateTimeProperty", mbc.ModelName); return(false); }); ModelBinderProviderCollection binders = new ModelBinderProviderCollection(); binders.RegisterBinderForType(typeof(string), mockStringBinder.Object, true /* suppressPrefixCheck */); binders.RegisterBinderForType(typeof(int), mockIntBinder.Object, true /* suppressPrefixCheck */); binders.RegisterBinderForType(typeof(DateTime), mockDateTimeBinder.Object, true /* suppressPrefixCheck */); ExtensibleModelBindingContext parentBindingContext = new ExtensibleModelBindingContext() { ModelMetadata = new EmptyModelMetadataProvider().GetMetadataForType(() => dto, typeof(ComplexModelDto)), ModelName = "theModel", ModelBinderProviders = binders }; ComplexModelDtoModelBinder binder = new ComplexModelDtoModelBinder(); // Act bool retVal = binder.BindModel(controllerContext, parentBindingContext); // Assert Assert.IsTrue(retVal); Assert.AreEqual(dto, parentBindingContext.Model, "The return model should have been the original DTO."); ComplexModelDtoResult stringDtoResult = dto.Results[dto.PropertyMetadata.Where(m => m.ModelType == typeof(string)).First()]; Assert.AreEqual("someStringValue", stringDtoResult.Model); Assert.AreEqual("theModel.StringProperty", stringDtoResult.ValidationNode.ModelStateKey); ComplexModelDtoResult intDtoResult = dto.Results[dto.PropertyMetadata.Where(m => m.ModelType == typeof(int)).First()]; Assert.AreEqual(42, intDtoResult.Model); Assert.AreEqual("theModel.IntProperty", intDtoResult.ValidationNode.ModelStateKey); ComplexModelDtoResult dateTimeDtoResult = dto.Results[dto.PropertyMetadata.Where(m => m.ModelType == typeof(DateTime)).First()]; Assert.IsNull(dateTimeDtoResult); }