Enable us to unit test `@Html...For()` methods

- add more `DefaultTemplatesUtilities.GetHtmlHelper()` overloads, all
  returning a strongly-typed helper
- also correct that method to ensure template helpers each get a unique
  `IHtmlHelper` instance
This commit is contained in:
dougbu 2014-06-26 14:41:16 -07:00
parent 88cd886a5b
commit 1a4d59ae14
3 changed files with 56 additions and 25 deletions

View File

@ -39,7 +39,7 @@ namespace Microsoft.AspNet.Mvc.Core.Test
public void ObjectTemplateDisplaysNullDisplayTextWhenObjectIsNull()
{
// Arrange
var html = DefaultTemplatesUtilities.GetHtmlHelper(null);
var html = DefaultTemplatesUtilities.GetHtmlHelper();
var metadata =
new EmptyModelMetadataProvider()
.GetMetadataForType(null, typeof(DefaultTemplatesUtilities.ObjectTemplateModel));

View File

@ -39,7 +39,7 @@ namespace Microsoft.AspNet.Mvc.Core.Test
public void ObjectTemplateDisplaysNullDisplayTextWithNullModelAndTemplateDepthGreaterThanOne()
{
// Arrange
var html = DefaultTemplatesUtilities.GetHtmlHelper(null);
var html = DefaultTemplatesUtilities.GetHtmlHelper();
var metadata =
new EmptyModelMetadataProvider()
.GetMetadataForType(null, typeof(DefaultTemplatesUtilities.ObjectTemplateModel));
@ -83,11 +83,15 @@ namespace Microsoft.AspNet.Mvc.Core.Test
{
// Arrange
var expected =
@"<div class=""editor-label""><label for=""Property1"">Property1</label></div>
<div class=""editor-field""><input class=""text-box single-line"" id=""Property1"" name=""Property1"" type=""text"" value="""" /> </div>
<div class=""editor-label""><label for=""Property1.Property3"">Property3</label></div>
<div class=""editor-field""> </div>
";
@"<div class=""editor-label""><label for=""Property1"">Property1</label></div>" +
Environment.NewLine +
@"<div class=""editor-field""><input class=""text-box single-line"" id=""Property1"" name=""Property1"" type=""text"" value="""" /> </div>" +
Environment.NewLine +
@"<div class=""editor-label""><label for=""Property3"">Property3</label></div>" +
Environment.NewLine +
@"<div class=""editor-field""><input class=""text-box single-line"" id=""Property3"" name=""Property3"" type=""text"" value="""" /> </div>" +
Environment.NewLine;
var model = new DefaultTemplatesUtilities.ObjectWithScaffoldColumn();
var viewEngine = new Mock<IViewEngine>();
viewEngine.Setup(v => v.FindPartialView(It.IsAny<IDictionary<string, object>>(), It.IsAny<string>()))

View File

@ -16,7 +16,7 @@ using Microsoft.AspNet.Security.DataProtection;
using Microsoft.Framework.OptionsModel;
using Moq;
namespace Microsoft.AspNet.Mvc.Core.Test
namespace Microsoft.AspNet.Mvc.Core
{
public class DefaultTemplatesUtilities
{
@ -43,14 +43,38 @@ namespace Microsoft.AspNet.Mvc.Core.Test
public string Property3 { get; set; }
}
public static HtmlHelper GetHtmlHelper(object model,
IViewEngine viewEngine = null)
public static HtmlHelper<ObjectTemplateModel> GetHtmlHelper()
{
var provider = new DataAnnotationsModelMetadataProvider();
var viewData = new ViewDataDictionary(provider);
return GetHtmlHelper<ObjectTemplateModel>(null);
}
public static HtmlHelper<TModel> GetHtmlHelper<TModel>(TModel model)
{
return GetHtmlHelper(model, CreateViewEngine());
}
public static HtmlHelper<ObjectTemplateModel> GetHtmlHelper(IModelMetadataProvider provider)
{
return GetHtmlHelper<ObjectTemplateModel>(null, provider);
}
public static HtmlHelper<TModel> GetHtmlHelper<TModel>(TModel model, IModelMetadataProvider provider)
{
return GetHtmlHelper(model, CreateViewEngine(), provider);
}
public static HtmlHelper<TModel> GetHtmlHelper<TModel>(TModel model, IViewEngine viewEngine)
{
return GetHtmlHelper(model, viewEngine, new DataAnnotationsModelMetadataProvider());
}
public static HtmlHelper<TModel> GetHtmlHelper<TModel>(
TModel model,
IViewEngine viewEngine,
IModelMetadataProvider provider)
{
var viewData = new ViewDataDictionary<TModel>(provider);
viewData.Model = model;
viewData.ModelMetadata =
provider.GetMetadataForType(() => model, typeof(ObjectTemplateModel));
var httpContext = new Mock<HttpContext>();
httpContext
@ -60,8 +84,6 @@ namespace Microsoft.AspNet.Mvc.Core.Test
.Setup(o => o.Items)
.Returns(new Dictionary<object, object>());
viewEngine = viewEngine ?? CreateViewEngine();
var actionContext = new ActionContext(httpContext.Object,
new RouteData(),
new ActionDescriptor());
@ -95,18 +117,23 @@ namespace Microsoft.AspNet.Mvc.Core.Test
var viewContext = new ViewContext(actionContext, Mock.Of<IView>(), viewData, new StringWriter());
var htmlHelper = new HtmlHelper(
viewEngine,
provider,
urlHelper,
GetAntiForgeryInstance(),
actionBindingContextProvider.Object);
htmlHelper.Contextualize(viewContext);
// TemplateRenderer will Contextualize this transient service.
serviceProvider
.Setup(s => s.GetService(typeof(IHtmlHelper)))
.Returns(htmlHelper);
.Returns(() => new HtmlHelper(
viewEngine,
provider,
urlHelper,
GetAntiForgeryInstance(),
actionBindingContextProvider.Object));
var htmlHelper = new HtmlHelper<TModel>(
viewEngine,
provider,
urlHelper,
GetAntiForgeryInstance(),
actionBindingContextProvider.Object);
htmlHelper.Contextualize(viewContext);
return htmlHelper;
}