public void UpdateCollectionReturnsModifiedCollectionOnSuccess() { // Arrange ControllerContext controllerContext = new Mock<ControllerContext>().Object; List<int> model = new List<int>() { 4, 5, 6, 7, 8 }; ModelBindingContext bindingContext = new ModelBindingContext() { Model = model, ModelName = "foo", PropertyFilter = _ => false, ValueProvider = new Dictionary<string, ValueProviderResult>() { { "foo[0]", null }, { "foo[1]", null }, { "foo[2]", null } } }; Mock<IModelBinder> mockInnerBinder = new Mock<IModelBinder>(); mockInnerBinder .Expect(b => b.BindModel(It.IsAny<ControllerContext>(), It.IsAny<ModelBindingContext>())) .Returns( delegate(ControllerContext cc, ModelBindingContext bc) { Assert.AreEqual(controllerContext, cc, "ControllerContext was not forwarded correctly."); Assert.AreEqual(typeof(int), bc.ModelType, "ModelType was not forwarded correctly."); Assert.AreEqual(bindingContext.ModelState, bc.ModelState, "ModelState was not forwarded correctly."); Assert.AreEqual(bindingContext.PropertyFilter, bc.PropertyFilter, "PropertyFilter was not forwarded correctly."); Assert.AreEqual(bindingContext.ValueProvider, bc.ValueProvider, "ValueProvider was not forwarded correctly."); return Int32.Parse(bc.ModelName.Substring(4, 1), CultureInfo.InvariantCulture); }); DefaultModelBinder binder = new DefaultModelBinder() { Binders = new ModelBinderDictionary() { { typeof(int), mockInnerBinder.Object } } }; // Act object updatedModel = binder.UpdateCollection(controllerContext, bindingContext, typeof(int)); // Assert Assert.AreSame(model, updatedModel, "Should have updated the provided model object."); Assert.AreEqual(3, model.Count, "Model is not of correct length."); Assert.AreEqual(0, model[0]); Assert.AreEqual(1, model[1]); Assert.AreEqual(2, model[2]); }
public void UpdateCollectionReturnsNullIfZeroIndexNotFound() { // Arrange ModelBindingContext bindingContext = new ModelBindingContext() { ValueProvider = new Dictionary<string, ValueProviderResult>() }; DefaultModelBinder binder = new DefaultModelBinder(); // Act object updatedModel = binder.UpdateCollection(null, bindingContext, typeof(object)); // Assert Assert.IsNull(updatedModel, "Method should return null if no values exist as part of the request."); }
public void UpdateCollectionCreatesDefaultEntriesForInvalidElements() { // Arrange List<int> model = new List<int>() { 4, 5, 6, 7, 8 }; ModelBindingContext bindingContext = new ModelBindingContext() { Model = model, ModelName = "foo", ValueProvider = new Dictionary<string, ValueProviderResult>() { { "foo[0]", null }, { "foo[1]", null }, { "foo[2]", null } } }; Mock<IModelBinder> mockInnerBinder = new Mock<IModelBinder>(); mockInnerBinder .Expect(b => b.BindModel(It.IsAny<ControllerContext>(), It.IsAny<ModelBindingContext>())) .Returns( delegate(ControllerContext cc, ModelBindingContext bc) { int fooIdx = Int32.Parse(bc.ModelName.Substring(4, 1), CultureInfo.InvariantCulture); return (fooIdx == 1) ? (object)null : fooIdx; }); DefaultModelBinder binder = new DefaultModelBinder() { Binders = new ModelBinderDictionary() { { typeof(int), mockInnerBinder.Object } } }; // Act object updatedModel = binder.UpdateCollection(null, bindingContext, typeof(int)); // Assert Assert.AreEqual(3, model.Count, "Model is not of correct length."); Assert.AreEqual(false, bindingContext.ModelState.IsValidField("foo[1]"), "Conversion should have failed."); Assert.AreEqual("A value is required.", bindingContext.ModelState["foo[1]"].Errors[0].ErrorMessage, "Error message did not propagate correctly."); Assert.AreEqual(0, model[0]); Assert.AreEqual(0, model[1]); Assert.AreEqual(2, model[2]); }