Add `Html.BeginForm()` and `Html.BeginRouteForm()` tests

- helps w/ #453 since `Html.BeginForm()` wasn't previously tested
- provide a `DefaultTemplatesUtilities.GetHtmlHelper()` overload with an
  `IHtmlGenerator` parameter
- update `DefaultTemplateUtilities` to use `DefaultHttpContext`
 - stop using a mock for this purpose; provides a non-`null` `Request`

nit:
- `DefaultTemplatesUtilities.GetHtmlHelperForViewData()` -> `...GetHtmlHelper()`
  for consistency with other overloads
This commit is contained in:
Doug Bunting 2014-11-09 20:56:54 -08:00
parent 22fafe298c
commit 2982c72547
6 changed files with 1199 additions and 94 deletions

View File

@ -2,13 +2,12 @@
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Globalization;
using System.IO;
using System.Threading.Tasks;
using Microsoft.AspNet.Http;
using Microsoft.AspNet.Mvc.ModelBinding;
using Microsoft.AspNet.PipelineCore;
using Microsoft.AspNet.Routing;
using Microsoft.AspNet.Security.DataProtection;
using Microsoft.Framework.OptionsModel;
@ -55,13 +54,27 @@ namespace Microsoft.AspNet.Mvc.Rendering
provider: CreateModelMetadataProvider());
}
public static HtmlHelper<TModel> GetHtmlHelperForViewData<TModel>(ViewDataDictionary<TModel> viewData)
public static HtmlHelper<ObjectTemplateModel> GetHtmlHelper(IHtmlGenerator htmlGenerator)
{
return GetHtmlHelper(viewData,
CreateUrlHelper(),
CreateViewEngine(),
CreateModelMetadataProvider(),
innerHelperWrapper: null);
var metadataProvider = CreateModelMetadataProvider();
return GetHtmlHelper<ObjectTemplateModel>(
new ViewDataDictionary<ObjectTemplateModel>(metadataProvider),
CreateUrlHelper(),
CreateViewEngine(),
metadataProvider,
innerHelperWrapper: null,
htmlGenerator: htmlGenerator);
}
public static HtmlHelper<TModel> GetHtmlHelper<TModel>(ViewDataDictionary<TModel> viewData)
{
return GetHtmlHelper(
viewData,
CreateUrlHelper(),
CreateViewEngine(),
CreateModelMetadataProvider(),
innerHelperWrapper: null,
htmlGenerator: null);
}
public static HtmlHelper<TModel> GetHtmlHelper<TModel>(TModel model)
@ -116,7 +129,7 @@ namespace Microsoft.AspNet.Mvc.Rendering
var viewData = new ViewDataDictionary<TModel>(provider);
viewData.Model = model;
return GetHtmlHelper(viewData, urlHelper, viewEngine, provider, innerHelperWrapper);
return GetHtmlHelper(viewData, urlHelper, viewEngine, provider, innerHelperWrapper, htmlGenerator: null);
}
private static HtmlHelper<TModel> GetHtmlHelper<TModel>(
@ -124,30 +137,11 @@ namespace Microsoft.AspNet.Mvc.Rendering
IUrlHelper urlHelper,
ICompositeViewEngine viewEngine,
IModelMetadataProvider provider,
Func<IHtmlHelper, IHtmlHelper> innerHelperWrapper)
Func<IHtmlHelper, IHtmlHelper> innerHelperWrapper,
IHtmlGenerator htmlGenerator)
{
var httpContext = new Mock<HttpContext>();
httpContext
.Setup(o => o.Response)
.Returns(Mock.Of<HttpResponse>());
httpContext
.Setup(o => o.Items)
.Returns(new Dictionary<object, object>());
var actionContext = new ActionContext(httpContext.Object,
new RouteData(),
new ActionDescriptor());
var actionBindingContext = new ActionBindingContext(actionContext,
provider,
Mock.Of<IModelBinder>(),
Mock.Of<IValueProvider>(),
Mock.Of<IInputFormatterSelector>(),
new DataAnnotationsModelValidatorProvider());
var actionBindingContextProvider = new Mock<IActionBindingContextProvider>();
actionBindingContextProvider
.Setup(c => c.GetActionBindingContextAsync(It.IsAny<ActionContext>()))
.Returns(Task.FromResult(actionBindingContext));
var httpContext = new DefaultHttpContext();
var actionContext = new ActionContext(httpContext, new RouteData(), new ActionDescriptor());
var serviceProvider = new Mock<IServiceProvider>();
serviceProvider
@ -160,15 +154,27 @@ namespace Microsoft.AspNet.Mvc.Rendering
.Setup(s => s.GetService(typeof(IViewComponentHelper)))
.Returns(new Mock<IViewComponentHelper>().Object);
httpContext
.Setup(o => o.RequestServices)
.Returns(serviceProvider.Object);
httpContext.RequestServices = serviceProvider.Object;
if (htmlGenerator == null)
{
var actionBindingContext = new ActionBindingContext(
actionContext,
provider,
Mock.Of<IModelBinder>(),
Mock.Of<IValueProvider>(),
Mock.Of<IInputFormatterSelector>(),
new DataAnnotationsModelValidatorProvider());
var actionBindingContextProvider = new Mock<IActionBindingContextProvider>();
actionBindingContextProvider
.Setup(c => c.GetActionBindingContextAsync(It.IsAny<ActionContext>()))
.Returns(Task.FromResult(actionBindingContext));
var htmlGenerator = new DefaultHtmlGenerator(
actionBindingContextProvider.Object,
GetAntiForgeryInstance(),
provider,
urlHelper);
htmlGenerator = new DefaultHtmlGenerator(
actionBindingContextProvider.Object,
GetAntiForgeryInstance(),
provider,
urlHelper);
}
// TemplateRenderer will Contextualize this transient service.
var innerHelper = (IHtmlHelper)new HtmlHelper(htmlGenerator, viewEngine, provider);

View File

@ -19,7 +19,7 @@ namespace Microsoft.AspNet.Mvc.Rendering
// Arrange
var expected = @"<input checked=""checked"" id=""Property3"" name=""Property3"" type=""checkbox"" " +
@"value=""false"" /><input name=""Property3"" type=""hidden"" value=""false"" />";
var helper = DefaultTemplatesUtilities.GetHtmlHelperForViewData(GetTestModelViewData());
var helper = DefaultTemplatesUtilities.GetHtmlHelper(GetTestModelViewData());
// Act
var html = helper.CheckBox("Property3",
@ -36,7 +36,7 @@ namespace Microsoft.AspNet.Mvc.Rendering
// Arrange
var expected = @"<input checked=""checked"" id=""Property3"" name=""Property3"" type=""checkbox"" " +
@"value=""false"" /><input name=""Property3"" type=""hidden"" value=""false"" />";
var helper = DefaultTemplatesUtilities.GetHtmlHelperForViewData(GetTestModelViewData());
var helper = DefaultTemplatesUtilities.GetHtmlHelper(GetTestModelViewData());
// Act
var html = helper.CheckBox("Property3",
@ -69,7 +69,7 @@ namespace Microsoft.AspNet.Mvc.Rendering
{
// Arrange
var expected = "String was not recognized as a valid Boolean.";
var helper = DefaultTemplatesUtilities.GetHtmlHelperForViewData(GetTestModelViewData());
var helper = DefaultTemplatesUtilities.GetHtmlHelper(GetTestModelViewData());
// Act & Assert
var ex = Assert.Throws<FormatException>(
@ -83,7 +83,7 @@ namespace Microsoft.AspNet.Mvc.Rendering
// Arrange
var expected = @"<input checked=""checked"" id=""Property1"" name=""Property1"" type=""checkbox"" " +
@"value=""true"" /><input name=""Property1"" type=""hidden"" value=""false"" />";
var helper = DefaultTemplatesUtilities.GetHtmlHelperForViewData(GetTestModelViewData());
var helper = DefaultTemplatesUtilities.GetHtmlHelper(GetTestModelViewData());
// Act
var html = helper.CheckBox("Property1", isChecked: true, htmlAttributes: null);
@ -99,7 +99,7 @@ namespace Microsoft.AspNet.Mvc.Rendering
var expected = @"<input id=""Property1"" name=""Property1"" type=""checkbox"" value=""true"" />" +
@"<input name=""Property1"" type=""hidden"" value=""false"" />";
var valueProviderResult = new ValueProviderResult("false", "false", CultureInfo.InvariantCulture);
var helper = DefaultTemplatesUtilities.GetHtmlHelperForViewData(GetTestModelViewData());
var helper = DefaultTemplatesUtilities.GetHtmlHelper(GetTestModelViewData());
helper.ViewData.ModelState.SetModelValue("Property1", valueProviderResult);
// Act
@ -116,7 +116,7 @@ namespace Microsoft.AspNet.Mvc.Rendering
var expected = @"<input data-val=""true"" data-val-required=""The Name field is required."" id=""Name""" +
@" name=""Name"" type=""checkbox"" value=""true"" />" +
@"<input name=""Name"" type=""hidden"" value=""false"" />";
var helper = DefaultTemplatesUtilities.GetHtmlHelperForViewData(GetModelWithValidationViewData());
var helper = DefaultTemplatesUtilities.GetHtmlHelper(GetModelWithValidationViewData());
// Act
var html = helper.CheckBox("Name", isChecked: null, htmlAttributes: null);
@ -132,7 +132,7 @@ namespace Microsoft.AspNet.Mvc.Rendering
var expected = @"<input checked=""checked"" id=""Property1"" name=""Property1"" " +
@"Property1-Property3=""Property3ObjValue"" type=""checkbox"" value=""true"" /><input " +
@"name=""Property1"" type=""hidden"" value=""false"" />";
var helper = DefaultTemplatesUtilities.GetHtmlHelper(GetTestModelViewData());
var helper = DefaultTemplatesUtilities.GetHtmlHelper<ViewDataDictionary<TestModel>>(GetTestModelViewData());
var htmlAttributes = new { Property1_Property3 = "Property3ObjValue" };
// Act
@ -204,7 +204,7 @@ namespace Microsoft.AspNet.Mvc.Rendering
var expected = @"<input checked=""checked"" id=""ComplexProperty_Property1"" name=""ComplexProperty."+
@"Property1"" type=""checkbox"" value=""true"" /><input name=""ComplexProperty.Property1""" +
@" type=""hidden"" value=""false"" />";
var helper = DefaultTemplatesUtilities.GetHtmlHelperForViewData(GetModelWithValidationViewData());
var helper = DefaultTemplatesUtilities.GetHtmlHelper(GetModelWithValidationViewData());
// Act
var html = helper.CheckBox("ComplexProperty.Property1", isChecked: null, htmlAttributes: null);
@ -218,7 +218,7 @@ namespace Microsoft.AspNet.Mvc.Rendering
{
// Arrange
var expected = "String was not recognized as a valid Boolean.";
var helper = DefaultTemplatesUtilities.GetHtmlHelperForViewData(GetTestModelViewData());
var helper = DefaultTemplatesUtilities.GetHtmlHelper(GetTestModelViewData());
// Act & Assert
// "Property2" in ViewData isn't a valid boolean
@ -232,7 +232,7 @@ namespace Microsoft.AspNet.Mvc.Rendering
// Arrange
var expected = @"<input checked=""checked"" id=""Property3"" name=""Property3"" type=""checkbox"" " +
@"value=""false"" /><input name=""Property3"" type=""hidden"" value=""false"" />";
var helper = DefaultTemplatesUtilities.GetHtmlHelperForViewData(GetTestModelViewData());
var helper = DefaultTemplatesUtilities.GetHtmlHelper(GetTestModelViewData());
// Act
var html = helper.CheckBoxFor(m => m.Property3, new { @checked = "checked", value = "false" });
@ -253,7 +253,7 @@ namespace Microsoft.AspNet.Mvc.Rendering
{
Model = new ModelWithValidation()
};
var helper = DefaultTemplatesUtilities.GetHtmlHelperForViewData(viewDataDictionary);
var helper = DefaultTemplatesUtilities.GetHtmlHelper(viewDataDictionary);
// Act
var html = helper.CheckBoxFor(m => m.Name, htmlAttributes: null);
@ -269,7 +269,7 @@ namespace Microsoft.AspNet.Mvc.Rendering
var expected = @"<input id=""Property1"" name=""Property1"" type=""checkbox"" value=""true"" />" +
@"<input name=""Property1"" type=""hidden"" value=""false"" />";
var viewData = GetTestModelViewData();
var helper = DefaultTemplatesUtilities.GetHtmlHelperForViewData(viewData);
var helper = DefaultTemplatesUtilities.GetHtmlHelper(viewData);
var valueProviderResult = new ValueProviderResult("false", "false", CultureInfo.InvariantCulture);
viewData.ModelState.SetModelValue("Property1", valueProviderResult);
@ -287,7 +287,7 @@ namespace Microsoft.AspNet.Mvc.Rendering
var expected = @"<input checked=""checked"" id=""Property1"" name=""Property1"" " +
@"Property1-Property3=""Property3ObjValue"" type=""checkbox"" value=""true"" /><input " +
@"name=""Property1"" type=""hidden"" value=""false"" />";
var helper = DefaultTemplatesUtilities.GetHtmlHelperForViewData(GetTestModelViewData());
var helper = DefaultTemplatesUtilities.GetHtmlHelper(GetTestModelViewData());
var htmlAttributes = new { Property1_Property3 = "Property3ObjValue" };
// Act
@ -304,7 +304,7 @@ namespace Microsoft.AspNet.Mvc.Rendering
var expected = @"<input checked=""checked"" id=""Property1"" name=""Property1"" " +
@"Property3=""Property3Value"" type=""checkbox"" value=""true"" /><input " +
@"name=""Property1"" type=""hidden"" value=""false"" />";
var helper = DefaultTemplatesUtilities.GetHtmlHelperForViewData(GetTestModelViewData());
var helper = DefaultTemplatesUtilities.GetHtmlHelper(GetTestModelViewData());
var attributes = new Dictionary<string, object> { { "Property3", "Property3Value" } };
// Act
@ -321,7 +321,7 @@ namespace Microsoft.AspNet.Mvc.Rendering
var expected = @"<input id=""MyPrefix_Property1"" name=""MyPrefix.Property1"" Property3=""PropValue"" " +
@"type=""checkbox"" value=""true"" /><input name=""MyPrefix.Property1"" type=""hidden"" " +
@"value=""false"" />";
var helper = DefaultTemplatesUtilities.GetHtmlHelperForViewData(GetTestModelViewData());
var helper = DefaultTemplatesUtilities.GetHtmlHelper(GetTestModelViewData());
helper.ViewContext.ViewData.TemplateInfo.HtmlFieldPrefix = "MyPrefix";
var attributes = new Dictionary<string, object> { { "Property3", "PropValue" } };
@ -339,7 +339,7 @@ namespace Microsoft.AspNet.Mvc.Rendering
var expected = @"<input checked=""checked"" id=""ComplexProperty_Property1"" name=""ComplexProperty." +
@"Property1"" type=""checkbox"" value=""true"" /><input name=""ComplexProperty.Property1"" " +
@"type=""hidden"" value=""false"" />";
var helper = DefaultTemplatesUtilities.GetHtmlHelperForViewData(GetModelWithValidationViewData());
var helper = DefaultTemplatesUtilities.GetHtmlHelper(GetModelWithValidationViewData());
// Act
var html = helper.CheckBoxFor(m => m.ComplexProperty.Property1, htmlAttributes: null);

View File

@ -21,7 +21,7 @@ namespace Microsoft.AspNet.Mvc.Core
// Arrange
var helper = DefaultTemplatesUtilities.GetHtmlHelper();
var enumerableHelper =
DefaultTemplatesUtilities.GetHtmlHelper<IEnumerable<DefaultTemplatesUtilities.ObjectTemplateModel>>(null);
DefaultTemplatesUtilities.GetHtmlHelper<IEnumerable<DefaultTemplatesUtilities.ObjectTemplateModel>>((IEnumerable<DefaultTemplatesUtilities.ObjectTemplateModel>)null);
// Act
var displayNameResult = helper.DisplayName(expression: string.Empty);
@ -44,7 +44,7 @@ namespace Microsoft.AspNet.Mvc.Core
// Arrange
var helper = DefaultTemplatesUtilities.GetHtmlHelper();
var enumerableHelper =
DefaultTemplatesUtilities.GetHtmlHelper<IEnumerable<DefaultTemplatesUtilities.ObjectTemplateModel>>(null);
DefaultTemplatesUtilities.GetHtmlHelper<IEnumerable<DefaultTemplatesUtilities.ObjectTemplateModel>>((IEnumerable<DefaultTemplatesUtilities.ObjectTemplateModel>)null);
// Act
var displayNameResult = helper.DisplayName("Property1");
@ -92,7 +92,7 @@ namespace Microsoft.AspNet.Mvc.Core
var helper = DefaultTemplatesUtilities.GetHtmlHelper();
helper.ViewData.ModelMetadata = metadata;
var enumerableHelper =
DefaultTemplatesUtilities.GetHtmlHelper<IEnumerable<DefaultTemplatesUtilities.ObjectTemplateModel>>(null);
DefaultTemplatesUtilities.GetHtmlHelper<IEnumerable<DefaultTemplatesUtilities.ObjectTemplateModel>>((IEnumerable<DefaultTemplatesUtilities.ObjectTemplateModel>)null);
enumerableHelper.ViewData.ModelMetadata = metadata;
// Act
@ -149,7 +149,7 @@ namespace Microsoft.AspNet.Mvc.Core
var helper = DefaultTemplatesUtilities.GetHtmlHelper();
helper.ViewData.ModelMetadata.DisplayName = displayName;
var enumerableHelper =
DefaultTemplatesUtilities.GetHtmlHelper<IEnumerable<DefaultTemplatesUtilities.ObjectTemplateModel>>(null);
DefaultTemplatesUtilities.GetHtmlHelper<IEnumerable<DefaultTemplatesUtilities.ObjectTemplateModel>>((IEnumerable<DefaultTemplatesUtilities.ObjectTemplateModel>)null);
enumerableHelper.ViewData.ModelMetadata.DisplayName = displayName;
// Act
@ -255,7 +255,7 @@ namespace Microsoft.AspNet.Mvc.Core
{
// Arrange
var helper =
DefaultTemplatesUtilities.GetHtmlHelper<IEnumerable<DefaultTemplatesUtilities.ObjectTemplateModel>>(null);
DefaultTemplatesUtilities.GetHtmlHelper<IEnumerable<DefaultTemplatesUtilities.ObjectTemplateModel>>((IEnumerable<DefaultTemplatesUtilities.ObjectTemplateModel>)null);
// Act & Assert
var exception = Assert.Throws<InvalidOperationException>(
@ -285,7 +285,7 @@ namespace Microsoft.AspNet.Mvc.Core
// Arrange
var unknownKey = "this is a dummy parameter value";
var helper =
DefaultTemplatesUtilities.GetHtmlHelper<IEnumerable<DefaultTemplatesUtilities.ObjectTemplateModel>>(null);
DefaultTemplatesUtilities.GetHtmlHelper<IEnumerable<DefaultTemplatesUtilities.ObjectTemplateModel>>((IEnumerable<DefaultTemplatesUtilities.ObjectTemplateModel>)null);
// Act
var result = helper.DisplayNameFor(model => unknownKey);

View File

@ -0,0 +1,818 @@

using System.Collections.Generic;
using System.IO;
using Moq;
using Xunit;
namespace Microsoft.AspNet.Mvc.Rendering
{
/// <summary>
/// Tests the <see cref="IHtmlHelper"/>'s <see cref="IHtmlHelper.BeginForm"/> and
/// <see cref="IHtmlHelper.BeginRouteForm"/> methods.
/// </summary>
public class HtmlHelperFormExtensionsTest
{
private static readonly IEnumerable<string> _actionNames = new List<string> { null, "Details" };
private static readonly IEnumerable<string> _controllerNames = new List<string> { null, "Product" };
private static readonly IEnumerable<object> _htmlAttributes = new List<object>
{
null,
new { isprint = "false", showreviews = "false" },
new Dictionary<string, object> { { "isprint", "false" }, { "showreviews", "true" }, },
};
private static readonly IEnumerable<FormMethod> _methods = new List<FormMethod>
{
FormMethod.Get,
FormMethod.Post,
};
private static readonly IEnumerable<string> _routeNames = new List<string> { null, "default" };
private static readonly IEnumerable<object> _routeValues = new List<object>
{
null,
new { p1_name = "p1-value" },
new Dictionary<string, object> { { "p1-name", "p1-value" }, { "p2-name", "p2-value" } },
};
public static TheoryData<string, string> ActionNameAndControllerNameDataSet
{
get
{
var dataSet = new TheoryData<string, string>();
foreach (var actionName in _actionNames)
{
foreach (var controllerName in _controllerNames)
{
dataSet.Add(actionName, controllerName);
}
}
return dataSet;
}
}
public static TheoryData<string, string, FormMethod> ActionNameControllerNameAndMethodDataSet
{
get
{
var dataSet = new TheoryData<string, string, FormMethod>();
foreach (var actionName in _actionNames)
{
foreach (var controllerName in _controllerNames)
{
foreach (var method in _methods)
{
dataSet.Add(actionName, controllerName, method);
}
}
}
return dataSet;
}
}
public static TheoryData<string, string, FormMethod, object> ActionNameControllerNameMethodAndHtmlAttributesDataSet
{
get
{
var dataSet = new TheoryData<string, string, FormMethod, object>();
foreach (var actionName in _actionNames)
{
foreach (var controllerName in _controllerNames)
{
foreach (var method in _methods)
{
foreach (var htmlAttributes in _htmlAttributes)
{
dataSet.Add(actionName, controllerName, method, htmlAttributes);
}
}
}
}
return dataSet;
}
}
public static TheoryData<string, string, object> ActionNameControllerNameAndRouteValuesDataSet
{
get
{
var dataSet = new TheoryData<string, string, object>();
foreach (var actionName in _actionNames)
{
foreach (var controllerName in _controllerNames)
{
foreach (var routeValues in _routeValues)
{
dataSet.Add(actionName, controllerName, routeValues);
}
}
}
return dataSet;
}
}
public static TheoryData<string, string, object, FormMethod> ActionNameControllerNameRouteValuesAndMethodDataSet
{
get
{
var dataSet = new TheoryData<string, string, object, FormMethod>();
foreach (var actionName in _actionNames)
{
foreach (var controllerName in _controllerNames)
{
foreach (var routeValues in _routeValues)
{
foreach (var method in _methods)
{
dataSet.Add(actionName, controllerName, routeValues, method);
}
}
}
}
return dataSet;
}
}
public static TheoryData<FormMethod> MethodDataSet
{
get
{
var dataSet = new TheoryData<FormMethod>();
foreach (var method in _methods)
{
dataSet.Add(method);
}
return dataSet;
}
}
public static TheoryData<FormMethod, object> MethodAndHtmlAttributesDataSet
{
get
{
var dataSet = new TheoryData<FormMethod, object>();
foreach (var method in _methods)
{
foreach (var htmlAttributes in _htmlAttributes)
{
dataSet.Add(method, htmlAttributes);
}
}
return dataSet;
}
}
public static TheoryData<string> RouteNameDataSet
{
get
{
var dataSet = new TheoryData<string>();
foreach (var routeName in _routeNames)
{
dataSet.Add(routeName);
}
return dataSet;
}
}
public static TheoryData<string, FormMethod> RouteNameAndMethodDataSet
{
get
{
var dataSet = new TheoryData<string, FormMethod>();
foreach (var routeName in _routeNames)
{
foreach (var method in _methods)
{
dataSet.Add(routeName, method);
}
}
return dataSet;
}
}
public static TheoryData<string, FormMethod, object> RouteNameMethodAndHtmlAttributesDataSet
{
get
{
var dataSet = new TheoryData<string, FormMethod, object>();
foreach (var routeName in _routeNames)
{
foreach (var method in _methods)
{
foreach (var htmlAttributes in _htmlAttributes)
{
dataSet.Add(routeName, method, htmlAttributes);
}
}
}
return dataSet;
}
}
public static TheoryData<string, object> RouteNameAndRouteValuesDataSet
{
get
{
var dataSet = new TheoryData<string, object>();
foreach (var routeName in _routeNames)
{
foreach (var routeValues in _routeValues)
{
dataSet.Add(routeName, routeValues);
}
}
return dataSet;
}
}
public static TheoryData<string, object, FormMethod> RouteNameRouteValuesAndMethodDataSet
{
get
{
var dataSet = new TheoryData<string, object, FormMethod>();
foreach (var routeName in _routeNames)
{
foreach (var routeValues in _routeValues)
{
foreach (var method in _methods)
{
dataSet.Add(routeName, routeValues, method);
}
}
}
return dataSet;
}
}
public static TheoryData<object> RouteValuesDataSet
{
get
{
var dataSet = new TheoryData<object>();
foreach (var routeValues in _routeValues)
{
dataSet.Add(routeValues);
}
return dataSet;
}
}
[Fact]
public void BeginFormWithNoParameters_CallsHtmlGeneratorWithExpectedValues()
{
// Arrange
var tagBuilder = new TagBuilder(tagName: "form");
var htmlGenerator = new Mock<IHtmlGenerator>(MockBehavior.Strict);
var htmlHelper = DefaultTemplatesUtilities.GetHtmlHelper(htmlGenerator.Object);
htmlGenerator
.Setup(realHelper => realHelper.GenerateForm(
htmlHelper.ViewContext,
null, // actionName
null, // controllerName
null, // routeValues
FormMethod.Post.ToString().ToLowerInvariant(),
null)) // htmlAttributes
.Returns(tagBuilder)
.Verifiable();
// Guards
Assert.NotNull(htmlHelper.ViewContext);
var writer = htmlHelper.ViewContext.Writer as StringWriter;
Assert.NotNull(writer);
var builder = writer.GetStringBuilder();
Assert.NotNull(builder);
// Act
var mvcForm = htmlHelper.BeginForm();
// Assert
Assert.NotNull(mvcForm);
Assert.Equal("<form>", builder.ToString());
htmlGenerator.Verify();
}
[Theory]
[MemberData(nameof(MethodDataSet))]
public void BeginFormWithMethodParameter_CallsHtmlGeneratorWithExpectedValues(FormMethod method)
{
// Arrange
var tagBuilder = new TagBuilder(tagName: "form");
var htmlGenerator = new Mock<IHtmlGenerator>(MockBehavior.Strict);
var htmlHelper = DefaultTemplatesUtilities.GetHtmlHelper(htmlGenerator.Object);
htmlGenerator
.Setup(realHelper => realHelper.GenerateForm(
htmlHelper.ViewContext,
null, // actionName
null, // controllerName
null, // routeValues
method.ToString().ToLowerInvariant(),
null)) // htmlAttributes
.Returns(tagBuilder)
.Verifiable();
// Guards
Assert.NotNull(htmlHelper.ViewContext);
var writer = htmlHelper.ViewContext.Writer as StringWriter;
Assert.NotNull(writer);
var builder = writer.GetStringBuilder();
Assert.NotNull(builder);
// Act
var mvcForm = htmlHelper.BeginForm(method);
// Assert
Assert.NotNull(mvcForm);
Assert.Equal("<form>", builder.ToString());
htmlGenerator.Verify();
}
[Theory]
[MemberData(nameof(MethodAndHtmlAttributesDataSet))]
public void BeginFormWithMethodAndHtmlAttributesParameters_CallsHtmlGeneratorWithExpectedValues(
FormMethod method,
object htmlAttributes)
{
// Arrange
var tagBuilder = new TagBuilder(tagName: "form");
var htmlGenerator = new Mock<IHtmlGenerator>(MockBehavior.Strict);
var htmlHelper = DefaultTemplatesUtilities.GetHtmlHelper(htmlGenerator.Object);
htmlGenerator
.Setup(realHelper => realHelper.GenerateForm(
htmlHelper.ViewContext,
null, // actionName
null, // controllerName
null, // routeValues
method.ToString().ToLowerInvariant(),
htmlAttributes))
.Returns(tagBuilder)
.Verifiable();
// Guards
Assert.NotNull(htmlHelper.ViewContext);
var writer = htmlHelper.ViewContext.Writer as StringWriter;
Assert.NotNull(writer);
var builder = writer.GetStringBuilder();
Assert.NotNull(builder);
// Act
var mvcForm = htmlHelper.BeginForm(method, htmlAttributes);
// Assert
Assert.NotNull(mvcForm);
Assert.Equal("<form>", builder.ToString());
htmlGenerator.Verify();
}
[Theory]
[MemberData(nameof(RouteValuesDataSet))]
public void BeginFormWithRouteValuesParameter_CallsHtmlGeneratorWithExpectedValues(object routeValues)
{
// Arrange
var tagBuilder = new TagBuilder(tagName: "form");
var htmlGenerator = new Mock<IHtmlGenerator>(MockBehavior.Strict);
var htmlHelper = DefaultTemplatesUtilities.GetHtmlHelper(htmlGenerator.Object);
htmlGenerator
.Setup(realHelper => realHelper.GenerateForm(
htmlHelper.ViewContext,
null, // actionName
null, // controllerName
routeValues,
FormMethod.Post.ToString().ToLowerInvariant(),
null)) // htmlAttributes
.Returns(tagBuilder)
.Verifiable();
// Guards
Assert.NotNull(htmlHelper.ViewContext);
var writer = htmlHelper.ViewContext.Writer as StringWriter;
Assert.NotNull(writer);
var builder = writer.GetStringBuilder();
Assert.NotNull(builder);
// Act
var mvcForm = htmlHelper.BeginForm(routeValues);
// Assert
Assert.NotNull(mvcForm);
Assert.Equal("<form>", builder.ToString());
htmlGenerator.Verify();
}
[Theory]
[MemberData(nameof(ActionNameAndControllerNameDataSet))]
public void BeginFormWithActionNameAndControllerNameParameters_CallsHtmlGeneratorWithExpectedValues(
string actionName,
string controllerName)
{
// Arrange
var tagBuilder = new TagBuilder(tagName: "form");
var htmlGenerator = new Mock<IHtmlGenerator>(MockBehavior.Strict);
var htmlHelper = DefaultTemplatesUtilities.GetHtmlHelper(htmlGenerator.Object);
htmlGenerator
.Setup(realHelper => realHelper.GenerateForm(
htmlHelper.ViewContext,
actionName,
controllerName,
null, // routeValues
FormMethod.Post.ToString().ToLowerInvariant(),
null)) // htmlAttributes
.Returns(tagBuilder)
.Verifiable();
// Guards
Assert.NotNull(htmlHelper.ViewContext);
var writer = htmlHelper.ViewContext.Writer as StringWriter;
Assert.NotNull(writer);
var builder = writer.GetStringBuilder();
Assert.NotNull(builder);
// Act
var mvcForm = htmlHelper.BeginForm(actionName, controllerName);
// Assert
Assert.NotNull(mvcForm);
Assert.Equal("<form>", builder.ToString());
htmlGenerator.Verify();
}
[Theory]
[MemberData(nameof(ActionNameControllerNameAndRouteValuesDataSet))]
public void BeginFormWithActionNameControllerNameAndRouteValuesParameters_CallsHtmlGeneratorWithExpectedValues(
string actionName,
string controllerName,
object routeValues)
{
// Arrange
var tagBuilder = new TagBuilder(tagName: "form");
var htmlGenerator = new Mock<IHtmlGenerator>(MockBehavior.Strict);
var htmlHelper = DefaultTemplatesUtilities.GetHtmlHelper(htmlGenerator.Object);
htmlGenerator
.Setup(realHelper => realHelper.GenerateForm(
htmlHelper.ViewContext,
actionName,
controllerName,
routeValues,
FormMethod.Post.ToString().ToLowerInvariant(),
null)) // htmlAttributes
.Returns(tagBuilder)
.Verifiable();
// Guards
Assert.NotNull(htmlHelper.ViewContext);
var writer = htmlHelper.ViewContext.Writer as StringWriter;
Assert.NotNull(writer);
var builder = writer.GetStringBuilder();
Assert.NotNull(builder);
// Act
var mvcForm = htmlHelper.BeginForm(actionName, controllerName, routeValues);
// Assert
Assert.NotNull(mvcForm);
Assert.Equal("<form>", builder.ToString());
htmlGenerator.Verify();
}
[Theory]
[MemberData(nameof(ActionNameControllerNameAndMethodDataSet))]
public void BeginFormWithActionNameControllerNameAndMethodParameters_CallsHtmlGeneratorWithExpectedValues(
string actionName,
string controllerName,
FormMethod method)
{
// Arrange
var tagBuilder = new TagBuilder(tagName: "form");
var htmlGenerator = new Mock<IHtmlGenerator>(MockBehavior.Strict);
var htmlHelper = DefaultTemplatesUtilities.GetHtmlHelper(htmlGenerator.Object);
htmlGenerator
.Setup(realHelper => realHelper.GenerateForm(
htmlHelper.ViewContext,
actionName,
controllerName,
null, // routeValues
method.ToString().ToLowerInvariant(),
null)) // htmlAttributes
.Returns(tagBuilder)
.Verifiable();
// Guards
Assert.NotNull(htmlHelper.ViewContext);
var writer = htmlHelper.ViewContext.Writer as StringWriter;
Assert.NotNull(writer);
var builder = writer.GetStringBuilder();
Assert.NotNull(builder);
// Act
var mvcForm = htmlHelper.BeginForm(actionName, controllerName, method);
// Assert
Assert.NotNull(mvcForm);
Assert.Equal("<form>", builder.ToString());
htmlGenerator.Verify();
}
[Theory]
[MemberData(nameof(ActionNameControllerNameRouteValuesAndMethodDataSet))]
public void BeginFormWithActionNameContollerNameRouteValuesAndMethodParameters_CallsHtmlGeneratorWithExpectedValues(
string actionName,
string controllerName,
object routeValues,
FormMethod method)
{
// Arrange
var tagBuilder = new TagBuilder(tagName: "form");
var htmlGenerator = new Mock<IHtmlGenerator>(MockBehavior.Strict);
var htmlHelper = DefaultTemplatesUtilities.GetHtmlHelper(htmlGenerator.Object);
htmlGenerator
.Setup(realHelper => realHelper.GenerateForm(
htmlHelper.ViewContext,
actionName,
controllerName,
routeValues,
method.ToString().ToLowerInvariant(),
null)) // htmlAttributes
.Returns(tagBuilder)
.Verifiable();
// Guards
Assert.NotNull(htmlHelper.ViewContext);
var writer = htmlHelper.ViewContext.Writer as StringWriter;
Assert.NotNull(writer);
var builder = writer.GetStringBuilder();
Assert.NotNull(builder);
// Act
var mvcForm = htmlHelper.BeginForm(actionName, controllerName, routeValues, method);
// Assert
Assert.NotNull(mvcForm);
Assert.Equal("<form>", builder.ToString());
htmlGenerator.Verify();
}
[Theory]
[MemberData(nameof(ActionNameControllerNameMethodAndHtmlAttributesDataSet))]
public void BeginFormWithActionNameContollerNameMethodAndHtmlAttributesParameters_CallsHtmlGeneratorWithExpectedValues(
string actionName,
string controllerName,
FormMethod method,
object htmlAttributes)
{
// Arrange
var tagBuilder = new TagBuilder(tagName: "form");
var htmlGenerator = new Mock<IHtmlGenerator>(MockBehavior.Strict);
var htmlHelper = DefaultTemplatesUtilities.GetHtmlHelper(htmlGenerator.Object);
htmlGenerator
.Setup(realHelper => realHelper.GenerateForm(
htmlHelper.ViewContext,
actionName,
controllerName,
null, // routeValues
method.ToString().ToLowerInvariant(),
htmlAttributes))
.Returns(tagBuilder)
.Verifiable();
// Guards
Assert.NotNull(htmlHelper.ViewContext);
var writer = htmlHelper.ViewContext.Writer as StringWriter;
Assert.NotNull(writer);
var builder = writer.GetStringBuilder();
Assert.NotNull(builder);
// Act
var mvcForm = htmlHelper.BeginForm(actionName, controllerName, method, htmlAttributes);
// Assert
Assert.NotNull(mvcForm);
Assert.Equal("<form>", builder.ToString());
htmlGenerator.Verify();
}
[Theory]
[MemberData(nameof(RouteValuesDataSet))]
public void BeginRouteFormWithRouteValuesParameter_CallsHtmlGeneratorWithExpectedValues(object routeValues)
{
// Arrange
var tagBuilder = new TagBuilder(tagName: "form");
var htmlGenerator = new Mock<IHtmlGenerator>(MockBehavior.Strict);
var htmlHelper = DefaultTemplatesUtilities.GetHtmlHelper(htmlGenerator.Object);
htmlGenerator
.Setup(realHelper => realHelper.GenerateRouteForm(
htmlHelper.ViewContext,
null, // routeName
routeValues,
FormMethod.Post.ToString().ToLowerInvariant(),
null)) // htmlAttributes
.Returns(tagBuilder)
.Verifiable();
// Guards
Assert.NotNull(htmlHelper.ViewContext);
var writer = htmlHelper.ViewContext.Writer as StringWriter;
Assert.NotNull(writer);
var builder = writer.GetStringBuilder();
Assert.NotNull(builder);
// Act
var mvcForm = htmlHelper.BeginRouteForm(routeValues);
// Assert
Assert.NotNull(mvcForm);
Assert.Equal("<form>", builder.ToString());
htmlGenerator.Verify();
}
[Theory]
[MemberData(nameof(RouteNameDataSet))]
public void BeginRouteFormWithRouteNameParameter_CallsHtmlGeneratorWithExpectedValues(string routeName)
{
// Arrange
var tagBuilder = new TagBuilder(tagName: "form");
var htmlGenerator = new Mock<IHtmlGenerator>(MockBehavior.Strict);
var htmlHelper = DefaultTemplatesUtilities.GetHtmlHelper(htmlGenerator.Object);
htmlGenerator
.Setup(realHelper => realHelper.GenerateRouteForm(
htmlHelper.ViewContext,
routeName,
null, // routeValues
FormMethod.Post.ToString().ToLowerInvariant(),
null)) // htmlAttributes
.Returns(tagBuilder)
.Verifiable();
// Guards
Assert.NotNull(htmlHelper.ViewContext);
var writer = htmlHelper.ViewContext.Writer as StringWriter;
Assert.NotNull(writer);
var builder = writer.GetStringBuilder();
Assert.NotNull(builder);
// Act
var mvcForm = htmlHelper.BeginRouteForm(routeName);
// Assert
Assert.NotNull(mvcForm);
Assert.Equal("<form>", builder.ToString());
htmlGenerator.Verify();
}
[Theory]
[MemberData(nameof(RouteNameAndRouteValuesDataSet))]
public void BeginRouteFormWithRouteNameAndRouteValuesParameters_CallsHtmlGeneratorWithExpectedValues(
string routeName,
object routeValues)
{
// Arrange
var tagBuilder = new TagBuilder(tagName: "form");
var htmlGenerator = new Mock<IHtmlGenerator>(MockBehavior.Strict);
var htmlHelper = DefaultTemplatesUtilities.GetHtmlHelper(htmlGenerator.Object);
htmlGenerator
.Setup(realHelper => realHelper.GenerateRouteForm(
htmlHelper.ViewContext,
routeName,
routeValues,
FormMethod.Post.ToString().ToLowerInvariant(),
null)) // htmlAttributes
.Returns(tagBuilder)
.Verifiable();
// Guards
Assert.NotNull(htmlHelper.ViewContext);
var writer = htmlHelper.ViewContext.Writer as StringWriter;
Assert.NotNull(writer);
var builder = writer.GetStringBuilder();
Assert.NotNull(builder);
// Act
var mvcForm = htmlHelper.BeginRouteForm(routeName, routeValues);
// Assert
Assert.NotNull(mvcForm);
Assert.Equal("<form>", builder.ToString());
htmlGenerator.Verify();
}
[Theory]
[MemberData(nameof(RouteNameAndMethodDataSet))]
public void BeginRouteFormWithRouteNameAndMethodParameters_CallsHtmlGeneratorWithExpectedValues(
string routeName,
FormMethod method)
{
// Arrange
var tagBuilder = new TagBuilder(tagName: "form");
var htmlGenerator = new Mock<IHtmlGenerator>(MockBehavior.Strict);
var htmlHelper = DefaultTemplatesUtilities.GetHtmlHelper(htmlGenerator.Object);
htmlGenerator
.Setup(realHelper => realHelper.GenerateRouteForm(
htmlHelper.ViewContext,
routeName,
null, // routeValues
method.ToString().ToLowerInvariant(),
null)) // htmlAttributes
.Returns(tagBuilder)
.Verifiable();
// Guards
Assert.NotNull(htmlHelper.ViewContext);
var writer = htmlHelper.ViewContext.Writer as StringWriter;
Assert.NotNull(writer);
var builder = writer.GetStringBuilder();
Assert.NotNull(builder);
// Act
var mvcForm = htmlHelper.BeginRouteForm(routeName, method);
// Assert
Assert.NotNull(mvcForm);
Assert.Equal("<form>", builder.ToString());
htmlGenerator.Verify();
}
[Theory]
[MemberData(nameof(RouteNameRouteValuesAndMethodDataSet))]
public void BeginRouteFormWithRouteNameRouteValuesAndMethodParameters_CallsHtmlGeneratorWithExpectedValues(
string routeName,
object routeValues,
FormMethod method)
{
// Arrange
var tagBuilder = new TagBuilder(tagName: "form");
var htmlGenerator = new Mock<IHtmlGenerator>(MockBehavior.Strict);
var htmlHelper = DefaultTemplatesUtilities.GetHtmlHelper(htmlGenerator.Object);
htmlGenerator
.Setup(realHelper => realHelper.GenerateRouteForm(
htmlHelper.ViewContext,
routeName,
routeValues,
method.ToString().ToLowerInvariant(),
null)) // htmlAttributes
.Returns(tagBuilder)
.Verifiable();
// Guards
Assert.NotNull(htmlHelper.ViewContext);
var writer = htmlHelper.ViewContext.Writer as StringWriter;
Assert.NotNull(writer);
var builder = writer.GetStringBuilder();
Assert.NotNull(builder);
// Act
var mvcForm = htmlHelper.BeginRouteForm(routeName, routeValues, method);
// Assert
Assert.NotNull(mvcForm);
Assert.Equal("<form>", builder.ToString());
htmlGenerator.Verify();
}
[Theory]
[MemberData(nameof(RouteNameMethodAndHtmlAttributesDataSet))]
public void BeginRouteFormWithRouteNameMethodAndHtmlAttributesParameters_CallsHtmlGeneratorWithExpectedValues(
string routeName,
FormMethod method,
object htmlAttributes)
{
// Arrange
var tagBuilder = new TagBuilder(tagName: "form");
var htmlGenerator = new Mock<IHtmlGenerator>(MockBehavior.Strict);
var htmlHelper = DefaultTemplatesUtilities.GetHtmlHelper(htmlGenerator.Object);
htmlGenerator
.Setup(realHelper => realHelper.GenerateRouteForm(
htmlHelper.ViewContext,
routeName,
null, // routeValues
method.ToString().ToLowerInvariant(),
htmlAttributes))
.Returns(tagBuilder)
.Verifiable();
// Guards
Assert.NotNull(htmlHelper.ViewContext);
var writer = htmlHelper.ViewContext.Writer as StringWriter;
Assert.NotNull(writer);
var builder = writer.GetStringBuilder();
Assert.NotNull(builder);
// Act
var mvcForm = htmlHelper.BeginRouteForm(routeName, method, htmlAttributes);
// Assert
Assert.NotNull(mvcForm);
Assert.Equal("<form>", builder.ToString());
htmlGenerator.Verify();
}
}
}

View File

@ -0,0 +1,281 @@

using System.Collections.Generic;
using System.IO;
using System.Linq;
using Microsoft.AspNet.Http;
using Moq;
using Xunit;
namespace Microsoft.AspNet.Mvc.Rendering
{
/// <summary>
/// Tests the <see cref="IHtmlHelper"/>'s <see cref="IHtmlHelper.BeginForm"/> and
/// <see cref="IHtmlHelper.BeginRouteForm"/>methods.
/// </summary>
public class HtmlHelperFormTest
{
// actionName, controllerName, routeValues, method, htmlAttributes
public static TheoryData<string, string, object, FormMethod, object> BeginFormDataSet
{
get
{
return new TheoryData<string, string, object, FormMethod, object>
{
{
null, null, null, FormMethod.Get, null
},
{
"Details", "Product", null, FormMethod.Get, null
},
{
"Details", "Product", null, FormMethod.Post, null
},
{
"Details", "Product", new { isprint = "false", showreviews = "false" }, FormMethod.Get, null
},
{
"Details", "Product", new { isprint = "false", showreviews = "true" }, FormMethod.Post, null
},
{
"Details", "Product", new { isprint = "true", showreviews = "false" }, FormMethod.Get,
new { p1_name = "p1-value" }
},
{
"Details", "Product", new { isprint = "true", showreviews = "true" }, FormMethod.Post,
new { p1_name = "p1-value" }
},
{
"Details", "Product",
new Dictionary<string, object> { { "isprint", "false" }, { "showreviews", "false" }, },
FormMethod.Get,
new Dictionary<string, object> { { "p1-name", "p1-value" }, { "p2-name", "p2-value" } }
},
{
"Details", "Product",
new Dictionary<string, object> { { "isprint", "false" }, { "showreviews", "false" }, },
FormMethod.Post,
new Dictionary<string, object> { { "p1-name", "p1-value" }, { "p2-name", "p2-value" } }
},
};
}
}
// routeName, routeValues, method, htmlAttributes
public static TheoryData<string, object, FormMethod, object> BeginRouteFormDataSet
{
get
{
return new TheoryData<string, object, FormMethod, object>
{
{
null, null, FormMethod.Get, null
},
{
null, null, FormMethod.Post, null
},
{
"default", null, FormMethod.Get, null
},
{
"default", null, FormMethod.Post, null
},
{
"default", new { isprint = "false", showreviews = "false" }, FormMethod.Get, null
},
{
"default", new { isprint = "false", showreviews = "true" }, FormMethod.Post, null
},
{
"default", new { isprint = "true", showreviews = "false" }, FormMethod.Get,
new { p1 = "p1-value" }
},
{
"default", new { isprint = "true", showreviews = "true" }, FormMethod.Post,
new { p1 = "p1-value" }
},
{
"default",
new Dictionary<string, object> { { "isprint", "false" }, { "showreviews", "false" }, },
FormMethod.Get,
new Dictionary<string, object> { { "p1-name", "p1-value" }, { "p2-name", "p2-value" } }
},
{
"default",
new Dictionary<string, object> { { "isprint", "false" }, { "showreviews", "false" }, },
FormMethod.Post,
new Dictionary<string, object> { { "p1-name", "p1-value" }, { "p2-name", "p2-value" } }
},
};
}
}
[Fact]
public void BeginForm_RendersExpectedValues_WithDefaultArguments()
{
// Arrange
var pathBase = "/Base";
var path = "/Path";
var queryString = "?query=string";
var expectedAction = pathBase + path + queryString;
var expectedStartTag = string.Format("<form action=\"{0}\" method=\"post\">", expectedAction);
// IUrlHelper should not be used in this scenario.
var urlHelper = new Mock<IUrlHelper>(MockBehavior.Strict);
var htmlHelper = DefaultTemplatesUtilities.GetHtmlHelper(urlHelper.Object);
// Guards
Assert.NotNull(htmlHelper.ViewContext);
var writer = htmlHelper.ViewContext.Writer as StringWriter;
Assert.NotNull(writer);
var builder = writer.GetStringBuilder();
Assert.NotNull(builder);
Assert.NotNull(htmlHelper.ViewContext.HttpContext);
var request = htmlHelper.ViewContext.HttpContext.Request;
Assert.NotNull(request);
// Set properties the IHtmlGenerator implementation should use in this scenario.
request.PathBase = new PathString(pathBase);
request.Path = new PathString(path);
request.QueryString = new QueryString(queryString);
// Act
var mvcForm = htmlHelper.BeginForm(
actionName: null,
controllerName: null,
routeValues: null,
method: FormMethod.Post,
htmlAttributes: null);
// Assert
Assert.NotNull(mvcForm);
Assert.Equal(expectedStartTag, builder.ToString());
urlHelper.Verify();
builder.Clear();
mvcForm.Dispose();
Assert.Equal("</form>", builder.ToString());
}
[Theory]
[MemberData(nameof(BeginFormDataSet))]
public void BeginForm_RendersExpectedValues(
string actionName,
string controllerName,
object routeValues,
FormMethod method,
object htmlAttributes)
{
// Arrange
var expectedAction = "http://localhost/Hello/World";
var expectedStartTag = string.Format(
"<form action=\"{0}\" method=\"{1}\"{2}>",
expectedAction,
method.ToString().ToLowerInvariant(),
GetHtmlAttributesAsString(htmlAttributes));
var urlHelper = new Mock<IUrlHelper>(MockBehavior.Strict);
urlHelper
.Setup(realHelper => realHelper.Action(
actionName,
controllerName,
routeValues,
null, // protocol
null, // host
null)) // fragment
.Returns(expectedAction)
.Verifiable();
var htmlHelper = DefaultTemplatesUtilities.GetHtmlHelper(urlHelper.Object);
// Guards
Assert.NotNull(htmlHelper.ViewContext);
var writer = htmlHelper.ViewContext.Writer as StringWriter;
Assert.NotNull(writer);
var builder = writer.GetStringBuilder();
Assert.NotNull(builder);
// Act
var mvcForm = htmlHelper.BeginForm(actionName, controllerName, routeValues, method, htmlAttributes);
// Assert
Assert.NotNull(mvcForm);
Assert.Equal(expectedStartTag, builder.ToString());
urlHelper.Verify();
}
[Theory]
[MemberData(nameof(BeginRouteFormDataSet))]
public void BeginRouteForm_RendersExpectedValues(
string routeName,
object routeValues,
FormMethod method,
object htmlAttributes)
{
// Arrange
var expectedAction = "http://localhost/Hello/World";
var expectedStartTag = string.Format(
"<form action=\"{0}\" method=\"{1}\"{2}>",
expectedAction,
method.ToString().ToLowerInvariant(),
GetHtmlAttributesAsString(htmlAttributes));
var urlHelper = new Mock<IUrlHelper>(MockBehavior.Strict);
urlHelper
.Setup(realHelper => realHelper.RouteUrl(
routeName,
routeValues,
null, // protocol
null, // host
null)) // fragment
.Returns(expectedAction)
.Verifiable();
var htmlHelper = DefaultTemplatesUtilities.GetHtmlHelper(urlHelper.Object);
// Guards
Assert.NotNull(htmlHelper.ViewContext);
var writer = htmlHelper.ViewContext.Writer as StringWriter;
Assert.NotNull(writer);
var builder = writer.GetStringBuilder();
Assert.NotNull(builder);
// Act
var mvcForm = htmlHelper.BeginRouteForm(routeName, routeValues, method, htmlAttributes);
// Assert
Assert.NotNull(mvcForm);
Assert.Equal(expectedStartTag, builder.ToString());
urlHelper.Verify();
}
[Fact]
public void EndForm_RendersExpectedValues()
{
// Arrange
// IUrlHelper should not be used in this scenario.
var urlHelper = new Mock<IUrlHelper>(MockBehavior.Strict);
var htmlHelper = DefaultTemplatesUtilities.GetHtmlHelper(urlHelper.Object);
// Guards
Assert.NotNull(htmlHelper.ViewContext);
var writer = htmlHelper.ViewContext.Writer as StringWriter;
Assert.NotNull(writer);
var builder = writer.GetStringBuilder();
Assert.NotNull(builder);
// Act
htmlHelper.EndForm();
// Assert
Assert.Equal("</form>", builder.ToString());
urlHelper.Verify();
}
private string GetHtmlAttributesAsString(object htmlAttributes)
{
var dictionary = HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes);
return string.Join(
string.Empty,
dictionary.Select(keyValue => string.Format(" {0}=\"{1}\"", keyValue.Key, keyValue.Value)));
}
}
}

View File

@ -49,7 +49,7 @@ namespace Microsoft.AspNet.Mvc.Rendering
public void HiddenWithArgumentValueAndAttributes_UsesArgumentValue(object attributes, string expected)
{
// Arrange
var helper = DefaultTemplatesUtilities.GetHtmlHelperForViewData(GetViewDataWithModelStateAndModelAndViewDataValues());
var helper = DefaultTemplatesUtilities.GetHtmlHelper(GetViewDataWithModelStateAndModelAndViewDataValues());
helper.ViewData.Model.Property1 = "should-not-be-used";
// Act
@ -65,7 +65,7 @@ namespace Microsoft.AspNet.Mvc.Rendering
// Arrange
var expected = @"<input id=""Property1"" name=""Property1"" type=""hidden"" value=""explicit-value"" />";
var attributes = new { value = "attribute-value" };
var helper = DefaultTemplatesUtilities.GetHtmlHelperForViewData(GetViewDataWithNullModelAndNonNullViewData());
var helper = DefaultTemplatesUtilities.GetHtmlHelper(GetViewDataWithNullModelAndNonNullViewData());
helper.ViewData.Clear();
// Act
@ -82,7 +82,7 @@ namespace Microsoft.AspNet.Mvc.Rendering
var expected = @"<input id=""Property1"" key=""value"" name=""Property1"" type=""hidden"" " +
@"value=""test"" />";
var attributes = new { key = "value" };
var helper = DefaultTemplatesUtilities.GetHtmlHelperForViewData(GetViewDataWithNullModelAndNonNullViewData());
var helper = DefaultTemplatesUtilities.GetHtmlHelper(GetViewDataWithNullModelAndNonNullViewData());
// Act
var result = helper.Hidden("Property1", "test", attributes);
@ -98,7 +98,7 @@ namespace Microsoft.AspNet.Mvc.Rendering
var expected = @"<input data-key=""value"" id=""Property1"" name=""Property1"" type=""hidden"" " +
@"value=""test"" />";
var attributes = new Dictionary<string, object> { { "data-key", "value" } };
var helper = DefaultTemplatesUtilities.GetHtmlHelperForViewData(GetViewDataWithNullModelAndNonNullViewData());
var helper = DefaultTemplatesUtilities.GetHtmlHelper(GetViewDataWithNullModelAndNonNullViewData());
// Act
var result = helper.Hidden("Property1", "test", attributes);
@ -112,7 +112,7 @@ namespace Microsoft.AspNet.Mvc.Rendering
{
// Arrange
var expected = @"<input id=""Property1"" name=""Property1"" type=""hidden"" value=""ModelStateValue"" />";
var helper = DefaultTemplatesUtilities.GetHtmlHelperForViewData(GetViewDataWithModelStateAndModelAndViewDataValues());
var helper = DefaultTemplatesUtilities.GetHtmlHelper(GetViewDataWithModelStateAndModelAndViewDataValues());
helper.ViewData.Model.Property1 = "test-value";
// Act
@ -127,7 +127,7 @@ namespace Microsoft.AspNet.Mvc.Rendering
{
// Arrange
var expected = @"<input id=""Property1"" name=""Property1"" type=""hidden"" value=""explicit-value"" />";
var helper = DefaultTemplatesUtilities.GetHtmlHelperForViewData(GetViewDataWithModelStateAndModelAndViewDataValues());
var helper = DefaultTemplatesUtilities.GetHtmlHelper(GetViewDataWithModelStateAndModelAndViewDataValues());
helper.ViewData.ModelState.Clear();
helper.ViewData.Model.Property1 = "property-value";
@ -143,7 +143,7 @@ namespace Microsoft.AspNet.Mvc.Rendering
{
// Arrange
var expected = @"<input id=""Property1"" name=""Property1"" type=""hidden"" value=""view-data-val"" />";
var helper = DefaultTemplatesUtilities.GetHtmlHelperForViewData(GetViewDataWithModelStateAndModelAndViewDataValues());
var helper = DefaultTemplatesUtilities.GetHtmlHelper(GetViewDataWithModelStateAndModelAndViewDataValues());
helper.ViewData.ModelState.Clear();
helper.ViewData.Model.Property1 = "property-value";
@ -159,7 +159,7 @@ namespace Microsoft.AspNet.Mvc.Rendering
{
// Arrange
var expected = @"<input id=""Property1"" name=""Property1"" type=""hidden"" value=""property-value"" />";
var helper = DefaultTemplatesUtilities.GetHtmlHelperForViewData(GetViewDataWithModelStateAndModelAndViewDataValues());
var helper = DefaultTemplatesUtilities.GetHtmlHelper(GetViewDataWithModelStateAndModelAndViewDataValues());
helper.ViewData.ModelState.Clear();
helper.ViewData.Clear();
helper.ViewData.Model.Property1 = "property-value";
@ -176,7 +176,7 @@ namespace Microsoft.AspNet.Mvc.Rendering
{
// Arrange
var expected = @"<input id=""Property1"" name=""Property1"" type=""hidden"" value="""" />";
var helper = DefaultTemplatesUtilities.GetHtmlHelperForViewData(GetViewDataWithModelStateAndModelAndViewDataValues());
var helper = DefaultTemplatesUtilities.GetHtmlHelper(GetViewDataWithModelStateAndModelAndViewDataValues());
helper.ViewData.ModelState.Clear();
helper.ViewData.Clear();
helper.ViewData.Model.Property1 = null;
@ -194,7 +194,7 @@ namespace Microsoft.AspNet.Mvc.Rendering
// Arrange
var expected = @"<input baz=""BazValue"" id=""keyNotFound"" name=""keyNotFound"" type=""hidden"" " +
@"value="""" />";
var helper = DefaultTemplatesUtilities.GetHtmlHelperForViewData(GetViewDataWithModelStateAndModelAndViewDataValues());
var helper = DefaultTemplatesUtilities.GetHtmlHelper(GetViewDataWithModelStateAndModelAndViewDataValues());
var attributes = new Dictionary<string, object> { { "baz", "BazValue" } };
// Act
@ -210,7 +210,7 @@ namespace Microsoft.AspNet.Mvc.Rendering
// Arrange
var expected = @"<input id=""MyPrefix_Property1"" name=""MyPrefix.Property1"" type=""hidden"" " +
@"value=""PropValue"" />";
var helper = DefaultTemplatesUtilities.GetHtmlHelperForViewData(GetViewDataWithModelStateAndModelAndViewDataValues());
var helper = DefaultTemplatesUtilities.GetHtmlHelper(GetViewDataWithModelStateAndModelAndViewDataValues());
helper.ViewContext.ViewData.TemplateInfo.HtmlFieldPrefix = "MyPrefix";
// Act
@ -225,7 +225,7 @@ namespace Microsoft.AspNet.Mvc.Rendering
{
// Arrange
var expected = @"<input id=""MyPrefix"" name=""MyPrefix"" type=""hidden"" value=""fooValue"" />";
var helper = DefaultTemplatesUtilities.GetHtmlHelperForViewData(GetViewDataWithModelStateAndModelAndViewDataValues());
var helper = DefaultTemplatesUtilities.GetHtmlHelper(GetViewDataWithModelStateAndModelAndViewDataValues());
helper.ViewContext.ViewData.TemplateInfo.HtmlFieldPrefix = "MyPrefix";
// Act
@ -241,7 +241,7 @@ namespace Microsoft.AspNet.Mvc.Rendering
// Arrange
var expected = @"<input id=""MyPrefix$Property1"" name=""MyPrefix.Property1"" type=""hidden"" " +
@"value=""modelstate-with-prefix"" />";
var helper = DefaultTemplatesUtilities.GetHtmlHelperForViewData(GetViewDataWithModelStateAndModelAndViewDataValues());
var helper = DefaultTemplatesUtilities.GetHtmlHelper(GetViewDataWithModelStateAndModelAndViewDataValues());
helper.ViewContext.ViewData.TemplateInfo.HtmlFieldPrefix = "MyPrefix";
helper.IdAttributeDotReplacement = "$";
helper.ViewData.ModelState.Clear();
@ -262,7 +262,7 @@ namespace Microsoft.AspNet.Mvc.Rendering
// Arrange
var expected = @"<input id=""MyPrefix$Property1"" name=""MyPrefix.Property1"" type=""hidden"" " +
@"value=""vdd-with-prefix"" />";
var helper = DefaultTemplatesUtilities.GetHtmlHelperForViewData(GetViewDataWithModelStateAndModelAndViewDataValues());
var helper = DefaultTemplatesUtilities.GetHtmlHelper(GetViewDataWithModelStateAndModelAndViewDataValues());
helper.ViewContext.ViewData.TemplateInfo.HtmlFieldPrefix = "MyPrefix";
helper.IdAttributeDotReplacement = "$";
helper.ViewData.ModelState.Clear();
@ -282,7 +282,7 @@ namespace Microsoft.AspNet.Mvc.Rendering
public void HiddenWithEmptyNameAndPrefixThrows()
{
// Arrange
var helper = DefaultTemplatesUtilities.GetHtmlHelperForViewData(GetViewDataWithModelStateAndModelAndViewDataValues());
var helper = DefaultTemplatesUtilities.GetHtmlHelper(GetViewDataWithModelStateAndModelAndViewDataValues());
var attributes = new Dictionary<string, object>
{
{ "class", "some-class"}
@ -299,7 +299,7 @@ namespace Microsoft.AspNet.Mvc.Rendering
// Arrange
var expected = @"<input baz=""BazValue"" class=""input-validation-error some-class"" id=""Property1""" +
@" name=""Property1"" type=""hidden"" value=""ModelStateValue"" />";
var helper = DefaultTemplatesUtilities.GetHtmlHelperForViewData(GetViewDataWithErrors());
var helper = DefaultTemplatesUtilities.GetHtmlHelper(GetViewDataWithErrors());
var attributes = new Dictionary<string, object>
{
{ "baz", "BazValue" },
@ -319,7 +319,7 @@ namespace Microsoft.AspNet.Mvc.Rendering
// Arrange
var expected = @"<input data-val=""true"" data-val-required=""The Property2 field is required."" " +
@"id=""Property2"" name=""Property2"" type=""hidden"" value="""" />";
var helper = DefaultTemplatesUtilities.GetHtmlHelperForViewData(GetViewDataWithModelStateAndModelAndViewDataValues());
var helper = DefaultTemplatesUtilities.GetHtmlHelper(GetViewDataWithModelStateAndModelAndViewDataValues());
// Act
var result = helper.Hidden("Property2", value: null, htmlAttributes: null);
@ -364,7 +364,7 @@ namespace Microsoft.AspNet.Mvc.Rendering
viewData["Property3[height]"] = "Prop3Value";
viewData["Property4.Property5"] = "Prop5Value";
viewData["Property4.Property6[0]"] = "Prop6Value";
var helper = DefaultTemplatesUtilities.GetHtmlHelperForViewData(viewData);
var helper = DefaultTemplatesUtilities.GetHtmlHelper(viewData);
var attributes = new Dictionary<string, object> { { "data-test", "val" } };
// Act
@ -403,7 +403,7 @@ namespace Microsoft.AspNet.Mvc.Rendering
viewData["Property3[height]"] = "Prop3Value";
viewData["Property4.Property5"] = "Prop5Value";
viewData["Property4.Property6[0]"] = "Prop6Value";
var helper = DefaultTemplatesUtilities.GetHtmlHelperForViewData(viewData);
var helper = DefaultTemplatesUtilities.GetHtmlHelper(viewData);
helper.IdAttributeDotReplacement = "$$";
var attributes = new Dictionary<string, object> { { "data-test", "val" } };
@ -419,7 +419,7 @@ namespace Microsoft.AspNet.Mvc.Rendering
{
// Arrange
var expected = @"<input id=""Bytes"" name=""Bytes"" type=""hidden"" value=""Fys1"" />";
var helper = DefaultTemplatesUtilities.GetHtmlHelperForViewData(GetViewDataWithModelStateAndModelAndViewDataValues());
var helper = DefaultTemplatesUtilities.GetHtmlHelper(GetViewDataWithModelStateAndModelAndViewDataValues());
helper.ViewData.Model.Bytes = new byte[] { 23, 43, 53 };
// Act
@ -434,7 +434,7 @@ namespace Microsoft.AspNet.Mvc.Rendering
public void HiddenForWithAttributes_GeneratesExpectedValue(object htmlAttributes, string expected)
{
// Arrange
var helper = DefaultTemplatesUtilities.GetHtmlHelperForViewData(GetViewDataWithModelStateAndModelAndViewDataValues());
var helper = DefaultTemplatesUtilities.GetHtmlHelper(GetViewDataWithModelStateAndModelAndViewDataValues());
helper.ViewData.Model.Property1 = "test";
// Act
@ -449,7 +449,7 @@ namespace Microsoft.AspNet.Mvc.Rendering
{
// Arrange
var expected = @"<input id=""Property1"" name=""Property1"" type=""hidden"" value=""ModelStateValue"" />";
var helper = DefaultTemplatesUtilities.GetHtmlHelperForViewData(GetViewDataWithModelStateAndModelAndViewDataValues());
var helper = DefaultTemplatesUtilities.GetHtmlHelper(GetViewDataWithModelStateAndModelAndViewDataValues());
helper.ViewData.Model.Property1 = "DefaultValue";
// Act
@ -464,7 +464,7 @@ namespace Microsoft.AspNet.Mvc.Rendering
{
// Arrange
var expected = @"<input id=""Property1"" name=""Property1"" type=""hidden"" value=""PropertyValue"" />";
var helper = DefaultTemplatesUtilities.GetHtmlHelperForViewData(GetViewDataWithModelStateAndModelAndViewDataValues());
var helper = DefaultTemplatesUtilities.GetHtmlHelper(GetViewDataWithModelStateAndModelAndViewDataValues());
helper.ViewData.ModelState.Clear();
helper.ViewData.Model.Property1 = "PropertyValue";
@ -480,7 +480,7 @@ namespace Microsoft.AspNet.Mvc.Rendering
{
// Arrange
var expected = @"<input id=""Property1"" name=""Property1"" type=""hidden"" value="""" />";
var helper = DefaultTemplatesUtilities.GetHtmlHelperForViewData(GetViewDataWithModelStateAndModelAndViewDataValues());
var helper = DefaultTemplatesUtilities.GetHtmlHelper(GetViewDataWithModelStateAndModelAndViewDataValues());
helper.ViewData.Model.Property1 = null;
helper.ViewData.ModelState.Clear();
@ -496,7 +496,7 @@ namespace Microsoft.AspNet.Mvc.Rendering
{
// Arrange
var expected = @"<input id=""Property1"" key=""value"" name=""Property1"" type=""hidden"" value="""" />";
var helper = DefaultTemplatesUtilities.GetHtmlHelperForViewData(GetViewDataWithNullModelAndNonNullViewData());
var helper = DefaultTemplatesUtilities.GetHtmlHelper(GetViewDataWithNullModelAndNonNullViewData());
var attributes = new Dictionary<string, object> { { "key", "value" } };
// Act
@ -513,7 +513,7 @@ namespace Microsoft.AspNet.Mvc.Rendering
// Arrange
var expected = @"<input id=""MyPrefix_Property1"" name=""MyPrefix.Property1"" type=""hidden"" " +
@"value=""propValue"" />";
var helper = DefaultTemplatesUtilities.GetHtmlHelperForViewData(GetViewDataWithModelStateAndModelAndViewDataValues());
var helper = DefaultTemplatesUtilities.GetHtmlHelper(GetViewDataWithModelStateAndModelAndViewDataValues());
helper.ViewData.Model.Property1 = "propValue";
helper.ViewContext.ViewData.TemplateInfo.HtmlFieldPrefix = "MyPrefix";
@ -530,7 +530,7 @@ namespace Microsoft.AspNet.Mvc.Rendering
// Arrange
var expected = @"<input id=""MyPrefix$Property1"" name=""MyPrefix.Property1"" type=""hidden"" " +
@"value=""modelstate-with-prefix"" />";
var helper = DefaultTemplatesUtilities.GetHtmlHelperForViewData(GetViewDataWithModelStateAndModelAndViewDataValues());
var helper = DefaultTemplatesUtilities.GetHtmlHelper(GetViewDataWithModelStateAndModelAndViewDataValues());
helper.ViewData.Model.Property1 = "propValue";
helper.ViewContext.ViewData.TemplateInfo.HtmlFieldPrefix = "MyPrefix";
helper.IdAttributeDotReplacement = "$";
@ -552,7 +552,7 @@ namespace Microsoft.AspNet.Mvc.Rendering
// Arrange
var expected = @"<input baz=""BazValue"" class=""input-validation-error some-class"" id=""Property1"" " +
@"name=""Property1"" type=""hidden"" value=""ModelStateValue"" />";
var helper = DefaultTemplatesUtilities.GetHtmlHelperForViewData(GetViewDataWithErrors());
var helper = DefaultTemplatesUtilities.GetHtmlHelper(GetViewDataWithErrors());
var attributes = new Dictionary<string, object>
{
{ "baz", "BazValue" },
@ -572,7 +572,7 @@ namespace Microsoft.AspNet.Mvc.Rendering
// Arrange
var expected = @"<input data-val=""true"" data-val-required=""The Property2 field is required."" " +
@"id=""Property2"" name=""Property2"" type=""hidden"" value="""" />";
var helper = DefaultTemplatesUtilities.GetHtmlHelperForViewData(GetViewDataWithErrors());
var helper = DefaultTemplatesUtilities.GetHtmlHelper(GetViewDataWithErrors());
// Act
var result = helper.HiddenFor(m => m.Property2, htmlAttributes: null);
@ -628,7 +628,7 @@ namespace Microsoft.AspNet.Mvc.Rendering
viewData.Model.Property4.Property5 = "ModelProp5Val";
viewData.Model.Property4.Property6.Add("ModelProp6Val");
var helper = DefaultTemplatesUtilities.GetHtmlHelperForViewData(viewData);
var helper = DefaultTemplatesUtilities.GetHtmlHelper(viewData);
var attributes = new Dictionary<string, object>
{
{ "data-val", "true" },
@ -679,7 +679,7 @@ namespace Microsoft.AspNet.Mvc.Rendering
viewData.ModelState.Add("pre.Property4.Property5", GetModelState("Prop5Val"));
viewData.ModelState.Add("pre.Property4.Property6[0]", GetModelState("Prop6Val"));
var helper = DefaultTemplatesUtilities.GetHtmlHelperForViewData(viewData);
var helper = DefaultTemplatesUtilities.GetHtmlHelper(viewData);
viewData.TemplateInfo.HtmlFieldPrefix = "pre";
var attributes = new { data_val = "true", value = "attr-val" };
@ -695,7 +695,7 @@ namespace Microsoft.AspNet.Mvc.Rendering
{
// Arrange
var expected = @"<input id=""Property1"" name=""Property1"" type=""hidden"" value="""" />";
var helper = DefaultTemplatesUtilities.GetHtmlHelperForViewData(GetViewDataWithNullModelAndNonNullViewData());
var helper = DefaultTemplatesUtilities.GetHtmlHelper(GetViewDataWithNullModelAndNonNullViewData());
var attributes = new Dictionary<string, object>
{
{ "value", "AttrValue" }