public void CanBindToExpiry()
        {
            // Arrange
            var formCollection = new NameValueCollection {
                { "foo.CardNo", "9999999999999999" },
                { "foo.Code", "999" },
                { "Expiry.Value.Month", "7" },
                { "Expiry.Value.Year", "2014" }
            };     // not sure why it doesn't work with foo prefix on Expiry?

            var valueProvider = new NameValueCollectionValueProvider(formCollection, null);
            var modelMetadata = ModelMetadataProviders.Current.GetMetadataForType(null, typeof(Card));

            var bindingContext = new ModelBindingContext
            {
                ModelName     = "foo",
                ValueProvider = valueProvider,
                ModelMetadata = modelMetadata
            };

            ControllerContext controllerContext = new ControllerContext();
            CardModelBinder   b = new CardModelBinder();

            // Act
            Card result = (Card)b.BindModel(controllerContext, bindingContext);

            // Assert
            Assert.AreEqual(7, result.Expiry.Value.Month, "Incorrect value for Month");
            Assert.AreEqual(2014, result.Expiry.Value.Year, "Incorrect value for Year");
        }
        public void CanBindToExpiry()
        {
            // Arrange
            var formCollection = new NameValueCollection {
                { "foo.CardNo", "9999999999999999" },
                { "foo.Code", "999" },
                { "Expiry.Value.Month", "7" },
                { "Expiry.Value.Year", "2014" }
            };     // not sure why it doesn't work with foo prefix on Expiry?

            var valueProvider = new NameValueCollectionValueProvider(formCollection, null);
            var modelMetadata = ModelMetadataProviders.Current.GetMetadataForType(null, typeof(Card));

            var bindingContext = new ModelBindingContext
            {
                ModelName = "foo",
                ValueProvider = valueProvider,
                ModelMetadata = modelMetadata
            };

            ControllerContext controllerContext = new ControllerContext();
            CardModelBinder b = new CardModelBinder();

            // Act
            Card result = (Card)b.BindModel(controllerContext, bindingContext);

            // Assert
            Assert.AreEqual(7, result.Expiry.Value.Month, "Incorrect value for Month");
            Assert.AreEqual(2014, result.Expiry.Value.Year, "Incorrect value for Year");
        }
        public void CanBindToExpiry()
        {
            // Arrange
            var formCollection = new NameValueCollection {
                { "foo.CardNo", "123456789" },
                { "foo.Code", "123" }
            };

            var valueProvider = new NameValueCollectionValueProvider(formCollection, null);
            var modelMetadata = ModelMetadataProviders.Current.GetMetadataForType(null, typeof(Card));

            var bindingContext = new ModelBindingContext
            {
                ModelName = "foo",
                ValueProvider = valueProvider,
                ModelMetadata = modelMetadata
            };

            var mockHttpContext = new Mock<HttpContextBase>();
            mockHttpContext
                .SetupGet(c => c.Request["Expiry.Value.Month"])
                .Returns(() => "7");
            mockHttpContext
                .SetupGet(c => c.Request["Expiry.Value.Year"])
                .Returns(() => "2014");

            ControllerContext controllerContext = new ControllerContext()
            {
                HttpContext = mockHttpContext.Object
            };

            CardModelBinder b = new CardModelBinder();

            // Act
            Card result = (Card)b.BindModel(controllerContext, bindingContext);

            // Assert
            Assert.AreEqual("123456789", result.CardNo, "Incorrect value for CardNo");
            Assert.AreEqual("123", result.Code, "Incorrect value for Code");

            Assert.AreEqual(7, result.Expiry.Value.Month, "Incorrect value for Month");
            Assert.AreEqual(2014, result.Expiry.Value.Year, "Incorrect value for Year");
        }
        public void CanBindToCard()
        {
            //  Arrange:
            //  Set up the BindingContext
            //  1.  Set up a NameValueCollection that represents the FormData (all string values)
            var formCollection = new NameValueCollection {
                { "myCard.CardNo", "12345678" },
                { "myCard.Code", "719" },
                { "myCard.Expiry", "01/09/2012" }
            };
            //  2.  Set up a valueProvider, containing the formData.
            var valueProvider = new NameValueCollectionValueProvider(formCollection, null);
            //  3.  Set up the meta data for the type Card
            var modelMetadata = ModelMetadataProviders.Current.GetMetadataForType(null, typeof(Card));
            //  4.  Create the bindingContext for the model
            var bindingContext = new ModelBindingContext
            {
                ModelName = "myCard",
                ValueProvider = valueProvider,
                ModelMetadata = modelMetadata
            };
            //  Set up the ControllerContext
            //  1.  We must mock the HttpContext, using 'Moq' NuGet package
            var mockHttpContext = new Mock<HttpContextBase>();
            //  2.  Set up the value to be returned by the mockHttpContext
            mockHttpContext
                .Setup(c => c.Request["Expiry.Value.Month"])
                .Returns(() => "7");
            mockHttpContext
                .Setup(c => c.Request["Expiry.Value.Year"])
                .Returns(() => "2014");
            //  3.  Create the controllerContext, using the mockHttpContext.Object
            ControllerContext controllerContext = new ControllerContext()
            {
                HttpContext = mockHttpContext.Object
            };

            //  Create an instance of the CardModelBinder
            var binder = new CardModelBinder();

            //  Act:
            Card result = (Card)binder.BindModel(controllerContext, bindingContext);

            //  Assert:
            Assert.AreEqual(result.CardNo, "12345678", "Expected the CardNo: '12345678'");
            Assert.AreEqual(result.Code, "719", "Expected the Code: '719'");
            Assert.AreEqual(result.Expiry, DateTime.Parse("01/07/2014"), "Expected Expiry date: '01/07/2014', the mocked value.");
        }