diff --git a/src/Microsoft.AspNet.Mvc.TagHelpers/AnchorTagHelper.cs b/src/Microsoft.AspNet.Mvc.TagHelpers/AnchorTagHelper.cs index 55cbd258ce..e8f087735b 100644 --- a/src/Microsoft.AspNet.Mvc.TagHelpers/AnchorTagHelper.cs +++ b/src/Microsoft.AspNet.Mvc.TagHelpers/AnchorTagHelper.cs @@ -18,8 +18,9 @@ namespace Microsoft.AspNet.Mvc.TagHelpers private const string RouteAttributePrefix = "route-"; private const string Href = "href"; + // Protected to ensure subclasses are correctly activated. Internal for ease of use when testing. [Activate] - private IHtmlGenerator Generator { get; set; } + protected internal IHtmlGenerator Generator { get; set; } /// /// The name of the action method. diff --git a/src/Microsoft.AspNet.Mvc.TagHelpers/FormTagHelper.cs b/src/Microsoft.AspNet.Mvc.TagHelpers/FormTagHelper.cs index c785a4c0a0..611b2a42cd 100644 --- a/src/Microsoft.AspNet.Mvc.TagHelpers/FormTagHelper.cs +++ b/src/Microsoft.AspNet.Mvc.TagHelpers/FormTagHelper.cs @@ -18,11 +18,13 @@ namespace Microsoft.AspNet.Mvc.TagHelpers { private const string RouteAttributePrefix = "route-"; + // Protected to ensure subclasses are correctly activated. Internal for ease of use when testing. [Activate] - private ViewContext ViewContext { get; set; } + protected internal ViewContext ViewContext { get; set; } + // Protected to ensure subclasses are correctly activated. Internal for ease of use when testing. [Activate] - private IHtmlGenerator Generator { get; set; } + protected internal IHtmlGenerator Generator { get; set; } /// /// The name of the action method. diff --git a/src/Microsoft.AspNet.Mvc.TagHelpers/TextAreaTagHelper.cs b/src/Microsoft.AspNet.Mvc.TagHelpers/TextAreaTagHelper.cs index 0f66052200..10d6b05c99 100644 --- a/src/Microsoft.AspNet.Mvc.TagHelpers/TextAreaTagHelper.cs +++ b/src/Microsoft.AspNet.Mvc.TagHelpers/TextAreaTagHelper.cs @@ -13,11 +13,13 @@ namespace Microsoft.AspNet.Mvc.TagHelpers [ContentBehavior(ContentBehavior.Replace)] public class TextAreaTagHelper : TagHelper { + // Protected to ensure subclasses are correctly activated. Internal for ease of use when testing. [Activate] - private IHtmlGenerator Generator { get; set; } + protected internal IHtmlGenerator Generator { get; set; } + // Protected to ensure subclasses are correctly activated. Internal for ease of use when testing. [Activate] - private ViewContext ViewContext { get; set; } + protected internal ViewContext ViewContext { get; set; } /// /// An expression to be evaluated against the current model. diff --git a/src/Microsoft.AspNet.Mvc.TagHelpers/ValidationMessageTagHelper.cs b/src/Microsoft.AspNet.Mvc.TagHelpers/ValidationMessageTagHelper.cs index e10d61183d..880685d3bc 100644 --- a/src/Microsoft.AspNet.Mvc.TagHelpers/ValidationMessageTagHelper.cs +++ b/src/Microsoft.AspNet.Mvc.TagHelpers/ValidationMessageTagHelper.cs @@ -14,11 +14,13 @@ namespace Microsoft.AspNet.Mvc.TagHelpers [ContentBehavior(ContentBehavior.Modify)] public class ValidationMessageTagHelper : TagHelper { + // Protected to ensure subclasses are correctly activated. Internal for ease of use when testing. [Activate] - private ViewContext ViewContext { get; set; } + protected internal ViewContext ViewContext { get; set; } + // Protected to ensure subclasses are correctly activated. Internal for ease of use when testing. [Activate] - private IHtmlGenerator Generator { get; set; } + protected internal IHtmlGenerator Generator { get; set; } /// /// Name to be validated on the current model. diff --git a/test/Microsoft.AspNet.Mvc.TagHelpers.Test/AnchorTagHelperTest.cs b/test/Microsoft.AspNet.Mvc.TagHelpers.Test/AnchorTagHelperTest.cs index 2e0fbc0367..74ff0a167d 100644 --- a/test/Microsoft.AspNet.Mvc.TagHelpers.Test/AnchorTagHelperTest.cs +++ b/test/Microsoft.AspNet.Mvc.TagHelpers.Test/AnchorTagHelperTest.cs @@ -3,10 +3,8 @@ using System; using System.Collections.Generic; -using System.Reflection; using System.Threading.Tasks; using Microsoft.AspNet.Mvc.ModelBinding; -using Microsoft.AspNet.Mvc.Razor; using Microsoft.AspNet.Mvc.Rendering; using Microsoft.AspNet.Razor.Runtime.TagHelpers; using Moq; @@ -65,9 +63,7 @@ namespace Microsoft.AspNet.Mvc.TagHelpers var viewContext = TestableHtmlGenerator.GetViewContext(model: null, htmlGenerator: htmlGenerator, metadataProvider: metadataProvider); - - var activator = new DefaultTagHelperActivator(); - activator.Activate(anchorTagHelper, viewContext); + anchorTagHelper.Generator = htmlGenerator; // Act await anchorTagHelper.ProcessAsync(tagHelperContext, output); @@ -106,8 +102,7 @@ namespace Microsoft.AspNet.Mvc.TagHelpers string.Empty, "Default", "http", "contoso.com", "hello=world", null, null)) .Returns(new TagBuilder("a")) .Verifiable(); - - SetGenerator(anchorTagHelper, generator.Object); + anchorTagHelper.Generator = generator.Object; // Act & Assert await anchorTagHelper.ProcessAsync(context, output); @@ -142,8 +137,7 @@ namespace Microsoft.AspNet.Mvc.TagHelpers string.Empty, "Index", "Home", "http", "contoso.com", "hello=world", null, null)) .Returns(new TagBuilder("a")) .Verifiable(); - - SetGenerator(anchorTagHelper, generator.Object); + anchorTagHelper.Generator = generator.Object; // Act & Assert await anchorTagHelper.ProcessAsync(context, output); @@ -188,10 +182,7 @@ namespace Microsoft.AspNet.Mvc.TagHelpers // Act & Assert var ex = await Assert.ThrowsAsync( - async () => - { - await anchorTagHelper.ProcessAsync(context: null, output: output); - }); + () => anchorTagHelper.ProcessAsync(context: null, output: output)); Assert.Equal(expectedErrorMessage, ex.Message); } @@ -216,20 +207,9 @@ namespace Microsoft.AspNet.Mvc.TagHelpers // Act & Assert var ex = await Assert.ThrowsAsync( - async () => - { - await anchorTagHelper.ProcessAsync(context: null, output: output); - }); + () => anchorTagHelper.ProcessAsync(context: null, output: output)); Assert.Equal(expectedErrorMessage, ex.Message); } - - private void SetGenerator(ITagHelper tagHelper, IHtmlGenerator generator) - { - var tagHelperType = tagHelper.GetType(); - - tagHelperType.GetProperty("Generator", BindingFlags.NonPublic | BindingFlags.Instance) - .SetValue(tagHelper, generator); - } } } \ No newline at end of file diff --git a/test/Microsoft.AspNet.Mvc.TagHelpers.Test/FormTagHelperTest.cs b/test/Microsoft.AspNet.Mvc.TagHelpers.Test/FormTagHelperTest.cs index 6a3a93f026..9c5af70a6b 100644 --- a/test/Microsoft.AspNet.Mvc.TagHelpers.Test/FormTagHelperTest.cs +++ b/test/Microsoft.AspNet.Mvc.TagHelpers.Test/FormTagHelperTest.cs @@ -4,12 +4,10 @@ using System; using System.Collections.Generic; using System.IO; -using System.Reflection; using System.Threading.Tasks; -using Microsoft.AspNet.Http; using Microsoft.AspNet.Mvc.ModelBinding; -using Microsoft.AspNet.Mvc.Razor; using Microsoft.AspNet.Mvc.Rendering; +using Microsoft.AspNet.PipelineCore; using Microsoft.AspNet.Razor.Runtime.TagHelpers; using Microsoft.AspNet.Routing; using Moq; @@ -65,8 +63,8 @@ namespace Microsoft.AspNet.Mvc.TagHelpers metadataProvider: metadataProvider); var expectedContent = "Something" + htmlGenerator.GenerateAntiForgery(viewContext) .ToString(TagRenderMode.SelfClosing); - var activator = new DefaultTagHelperActivator(); - activator.Activate(formTagHelper, viewContext); + formTagHelper.ViewContext = viewContext; + formTagHelper.Generator = htmlGenerator; // Act await formTagHelper.ProcessAsync(tagHelperContext, output); @@ -115,8 +113,8 @@ namespace Microsoft.AspNet.Mvc.TagHelpers generator.Setup(mock => mock.GenerateAntiForgery(viewContext)) .Returns(new TagBuilder("input")); - - SetViewContextAndGenerator(formTagHelper, viewContext, generator.Object); + formTagHelper.ViewContext = viewContext; + formTagHelper.Generator = generator.Object; // Act await formTagHelper.ProcessAsync(context, output); @@ -175,8 +173,8 @@ namespace Microsoft.AspNet.Mvc.TagHelpers }) .Returns(new TagBuilder("form")) .Verifiable(); - - SetViewContextAndGenerator(formTagHelper, testViewContext, generator.Object); + formTagHelper.ViewContext = testViewContext; + formTagHelper.Generator = generator.Object; // Act & Assert await formTagHelper.ProcessAsync(context, output); @@ -211,10 +209,8 @@ namespace Microsoft.AspNet.Mvc.TagHelpers .Setup(mock => mock.GenerateForm(viewContext, "Index", "Home", null, "POST", null)) .Returns(new TagBuilder("form")) .Verifiable(); - - SetViewContextAndGenerator(formTagHelper, - viewContext, - generator.Object); + formTagHelper.ViewContext = viewContext; + formTagHelper.Generator = generator.Object; // Act & Assert await formTagHelper.ProcessAsync(context, output); @@ -273,9 +269,9 @@ namespace Microsoft.AspNet.Mvc.TagHelpers Action = "http://www.contoso.com", AntiForgery = antiForgery, }; - SetViewContextAndGenerator(formTagHelper, - viewContext, - generator.Object); + formTagHelper.ViewContext = viewContext; + formTagHelper.Generator = generator.Object; + var output = new TagHelperOutput("form", attributes: new Dictionary(), content: string.Empty); @@ -313,10 +309,8 @@ namespace Microsoft.AspNet.Mvc.TagHelpers content: string.Empty); // Act & Assert - var ex = await Assert.ThrowsAsync(async () => - { - await formTagHelper.ProcessAsync(context: null, output: tagHelperOutput); - }); + var ex = await Assert.ThrowsAsync( + () => formTagHelper.ProcessAsync(context: null, output: tagHelperOutput)); Assert.Equal(expectedErrorMessage, ex.Message); } @@ -341,10 +335,8 @@ namespace Microsoft.AspNet.Mvc.TagHelpers content: string.Empty); // Act & Assert - var ex = await Assert.ThrowsAsync(async () => - { - await formTagHelper.ProcessAsync(context: null, output: tagHelperOutput); - }); + var ex = await Assert.ThrowsAsync( + () => formTagHelper.ProcessAsync(context: null, output: tagHelperOutput)); Assert.Equal(expectedErrorMessage, ex.Message); } @@ -352,7 +344,7 @@ namespace Microsoft.AspNet.Mvc.TagHelpers private static ViewContext CreateViewContext() { var actionContext = new ActionContext( - new Mock().Object, + new DefaultHttpContext(), new RouteData(), new ActionDescriptor()); @@ -361,19 +353,7 @@ namespace Microsoft.AspNet.Mvc.TagHelpers Mock.Of(), new ViewDataDictionary( new DataAnnotationsModelMetadataProvider()), - new StringWriter()); - } - - private static void SetViewContextAndGenerator(ITagHelper tagHelper, - ViewContext viewContext, - IHtmlGenerator generator) - { - var tagHelperType = tagHelper.GetType(); - - tagHelperType.GetProperty("ViewContext", BindingFlags.NonPublic | BindingFlags.Instance) - .SetValue(tagHelper, viewContext); - tagHelperType.GetProperty("Generator", BindingFlags.NonPublic | BindingFlags.Instance) - .SetValue(tagHelper, generator); + TextWriter.Null); } } } \ No newline at end of file diff --git a/test/Microsoft.AspNet.Mvc.TagHelpers.Test/LabelTagHelperTest.cs b/test/Microsoft.AspNet.Mvc.TagHelpers.Test/LabelTagHelperTest.cs index 4c353d62b4..2371398e1c 100644 --- a/test/Microsoft.AspNet.Mvc.TagHelpers.Test/LabelTagHelperTest.cs +++ b/test/Microsoft.AspNet.Mvc.TagHelpers.Test/LabelTagHelperTest.cs @@ -5,7 +5,6 @@ using System; using System.Collections.Generic; using System.Threading.Tasks; using Microsoft.AspNet.Mvc.ModelBinding; -using Microsoft.AspNet.Mvc.Razor; using Microsoft.AspNet.Mvc.Rendering; using Microsoft.AspNet.Razor.Runtime.TagHelpers; using Xunit; @@ -160,8 +159,8 @@ namespace Microsoft.AspNet.Mvc.TagHelpers var htmlGenerator = new TestableHtmlGenerator(metadataProvider); Model model = null; var viewContext = TestableHtmlGenerator.GetViewContext(model, htmlGenerator, metadataProvider); - var activator = new DefaultTagHelperActivator(); - activator.Activate(tagHelper, viewContext); + tagHelper.ViewContext = viewContext; + tagHelper.Generator = htmlGenerator; // Act await tagHelper.ProcessAsync(tagHelperContext, output); diff --git a/test/Microsoft.AspNet.Mvc.TagHelpers.Test/TestableHtmlGenerator.cs b/test/Microsoft.AspNet.Mvc.TagHelpers.Test/TestableHtmlGenerator.cs index 8f2b1481b7..d4c2499831 100644 --- a/test/Microsoft.AspNet.Mvc.TagHelpers.Test/TestableHtmlGenerator.cs +++ b/test/Microsoft.AspNet.Mvc.TagHelpers.Test/TestableHtmlGenerator.cs @@ -4,9 +4,9 @@ using System; using System.Collections.Generic; using System.IO; -using Microsoft.AspNet.Http; using Microsoft.AspNet.Mvc.ModelBinding; using Microsoft.AspNet.Mvc.Rendering; +using Microsoft.AspNet.PipelineCore; using Microsoft.AspNet.Routing; using Microsoft.AspNet.Security.DataProtection; using Microsoft.Framework.OptionsModel; @@ -50,22 +50,12 @@ namespace Microsoft.AspNet.Mvc.TagHelpers IHtmlGenerator htmlGenerator, IModelMetadataProvider metadataProvider) { - var serviceProvider = new Mock(); - serviceProvider - .Setup(provider => provider.GetService(typeof(IHtmlGenerator))) - .Returns(htmlGenerator); - - var httpContext = new Mock(); - httpContext - .Setup(context => context.RequestServices) - .Returns(serviceProvider.Object); - - var actionContext = new ActionContext(httpContext.Object, new RouteData(), new ActionDescriptor()); + var actionContext = new ActionContext(new DefaultHttpContext(), new RouteData(), new ActionDescriptor()); var viewData = new ViewDataDictionary(metadataProvider) { Model = model, }; - var viewContext = new ViewContext(actionContext, Mock.Of(), viewData, new StringWriter()); + var viewContext = new ViewContext(actionContext, Mock.Of(), viewData, TextWriter.Null); return viewContext; } diff --git a/test/Microsoft.AspNet.Mvc.TagHelpers.Test/TextAreaTagHelperTest.cs b/test/Microsoft.AspNet.Mvc.TagHelpers.Test/TextAreaTagHelperTest.cs index 20faf2cca6..2e8c19c91a 100644 --- a/test/Microsoft.AspNet.Mvc.TagHelpers.Test/TextAreaTagHelperTest.cs +++ b/test/Microsoft.AspNet.Mvc.TagHelpers.Test/TextAreaTagHelperTest.cs @@ -5,7 +5,6 @@ using System; using System.Collections.Generic; using System.Threading.Tasks; using Microsoft.AspNet.Mvc.ModelBinding; -using Microsoft.AspNet.Mvc.Razor; using Microsoft.AspNet.Mvc.Rendering; using Microsoft.AspNet.Razor.Runtime.TagHelpers; using Xunit; @@ -57,8 +56,8 @@ namespace Microsoft.AspNet.Mvc.TagHelpers { modelWithText, typeof(NestedModel), () => modelWithText.NestedModel.Text, "NestedModel.Text", Environment.NewLine + "inner text" }, - // Top-level indexing does not work end-to-end due to code generation issue #1345. - // TODO: Remove above comment when #1345 is fixed. + // Top-level indexing does not work end-to-end due to code generation issue #1345. + // TODO: Remove above comment when #1345 is fixed. { models, typeof(Model), () => models[0].Text, "[0].Text", Environment.NewLine }, { models, typeof(Model), () => models[1].Text, "[1].Text", @@ -119,8 +118,8 @@ namespace Microsoft.AspNet.Mvc.TagHelpers } }; var viewContext = TestableHtmlGenerator.GetViewContext(model, htmlGenerator, metadataProvider); - var activator = new DefaultTagHelperActivator(); - activator.Activate(tagHelper, viewContext); + tagHelper.ViewContext = viewContext; + tagHelper.Generator = htmlGenerator; // Act await tagHelper.ProcessAsync(tagHelperContext, output); @@ -166,8 +165,8 @@ namespace Microsoft.AspNet.Mvc.TagHelpers }; Model model = null; var viewContext = TestableHtmlGenerator.GetViewContext(model, htmlGenerator, metadataProvider); - var activator = new DefaultTagHelperActivator(); - activator.Activate(tagHelper, viewContext); + tagHelper.ViewContext = viewContext; + tagHelper.Generator = htmlGenerator; // Act await tagHelper.ProcessAsync(tagHelperContext, output); diff --git a/test/Microsoft.AspNet.Mvc.TagHelpers.Test/ValidationMessageTagHelperTest.cs b/test/Microsoft.AspNet.Mvc.TagHelpers.Test/ValidationMessageTagHelperTest.cs index dbd8af09b6..13ccaa5529 100644 --- a/test/Microsoft.AspNet.Mvc.TagHelpers.Test/ValidationMessageTagHelperTest.cs +++ b/test/Microsoft.AspNet.Mvc.TagHelpers.Test/ValidationMessageTagHelperTest.cs @@ -3,12 +3,10 @@ using System.Collections.Generic; using System.IO; -using System.Reflection; using System.Threading.Tasks; -using Microsoft.AspNet.Http; using Microsoft.AspNet.Mvc.ModelBinding; -using Microsoft.AspNet.Mvc.Razor; using Microsoft.AspNet.Mvc.Rendering; +using Microsoft.AspNet.PipelineCore; using Microsoft.AspNet.Razor.Runtime.TagHelpers; using Microsoft.AspNet.Routing; using Moq; @@ -46,9 +44,8 @@ namespace Microsoft.AspNet.Mvc.TagHelpers var viewContext = TestableHtmlGenerator.GetViewContext(model: null, htmlGenerator: htmlGenerator, metadataProvider: metadataProvider); - - var activator = new DefaultTagHelperActivator(); - activator.Activate(validationMessageTagHelper, viewContext); + validationMessageTagHelper.ViewContext = viewContext; + validationMessageTagHelper.Generator = htmlGenerator; // Act await validationMessageTagHelper.ProcessAsync(tagHelperContext, output); @@ -82,12 +79,12 @@ namespace Microsoft.AspNet.Mvc.TagHelpers var expectedViewContext = CreateViewContext(); var generator = new Mock(); generator - .Setup(mock => + .Setup(mock => mock.GenerateValidationMessage(expectedViewContext, "Hello", null, null, null)) .Returns(new TagBuilder("span")) .Verifiable(); - - SetViewContextAndGenerator(validationMessageTagHelper, expectedViewContext, generator.Object); + validationMessageTagHelper.Generator = generator.Object; + validationMessageTagHelper.ViewContext = expectedViewContext; // Act & Assert await validationMessageTagHelper.ProcessAsync(context: null, output: output); @@ -120,7 +117,6 @@ namespace Microsoft.AspNet.Mvc.TagHelpers tagBuilder.Attributes.Add("data-foo", "bar"); tagBuilder.Attributes.Add("data-hello", "world"); - var expectedViewContext = CreateViewContext(); var generator = new Mock(MockBehavior.Strict); var setup = generator .Setup(mock => mock.GenerateValidationMessage( @@ -130,8 +126,9 @@ namespace Microsoft.AspNet.Mvc.TagHelpers It.IsAny(), It.IsAny())) .Returns(tagBuilder); - - SetViewContextAndGenerator(validationMessageTagHelper, expectedViewContext, generator.Object); + var viewContext = CreateViewContext(); + validationMessageTagHelper.ViewContext = viewContext; + validationMessageTagHelper.Generator = generator.Object; // Act await validationMessageTagHelper.ProcessAsync(context: null, output: output); @@ -155,10 +152,10 @@ namespace Microsoft.AspNet.Mvc.TagHelpers "span", attributes: new Dictionary(), content: "Content of validation message"); - var expectedViewContext = CreateViewContext(); + var viewContext = CreateViewContext(); var generator = new Mock(MockBehavior.Strict); - - SetViewContextAndGenerator(validationMessageTagHelper, expectedViewContext, generator.Object); + validationMessageTagHelper.ViewContext = viewContext; + validationMessageTagHelper.Generator = generator.Object; // Act await validationMessageTagHelper.ProcessAsync(context: null, output: output); @@ -184,7 +181,7 @@ namespace Microsoft.AspNet.Mvc.TagHelpers private static ViewContext CreateViewContext() { var actionContext = new ActionContext( - new Mock().Object, + new DefaultHttpContext(), new RouteData(), new ActionDescriptor()); @@ -193,19 +190,7 @@ namespace Microsoft.AspNet.Mvc.TagHelpers Mock.Of(), new ViewDataDictionary( new DataAnnotationsModelMetadataProvider()), - new StringWriter()); - } - - private static void SetViewContextAndGenerator(ITagHelper tagHelper, - ViewContext viewContext, - IHtmlGenerator generator) - { - var tagHelperType = tagHelper.GetType(); - - tagHelperType.GetProperty("ViewContext", BindingFlags.NonPublic | BindingFlags.Instance) - .SetValue(tagHelper, viewContext); - tagHelperType.GetProperty("Generator", BindingFlags.NonPublic | BindingFlags.Instance) - .SetValue(tagHelper, generator); + TextWriter.Null); } } } \ No newline at end of file diff --git a/test/Microsoft.AspNet.Mvc.TagHelpers.Test/ValidationSummaryTagHelperTest.cs b/test/Microsoft.AspNet.Mvc.TagHelpers.Test/ValidationSummaryTagHelperTest.cs index 40ff2351ee..783958a9e6 100644 --- a/test/Microsoft.AspNet.Mvc.TagHelpers.Test/ValidationSummaryTagHelperTest.cs +++ b/test/Microsoft.AspNet.Mvc.TagHelpers.Test/ValidationSummaryTagHelperTest.cs @@ -4,11 +4,8 @@ using System; using System.Collections.Generic; using System.IO; -using System.Reflection; using System.Threading.Tasks; -using Microsoft.AspNet.Http; using Microsoft.AspNet.Mvc.ModelBinding; -using Microsoft.AspNet.Mvc.Razor; using Microsoft.AspNet.Mvc.Rendering; using Microsoft.AspNet.PipelineCore; using Microsoft.AspNet.Razor.Runtime.TagHelpers; @@ -259,8 +256,8 @@ namespace Microsoft.AspNet.Mvc.TagHelpers "are 'All', 'ModelOnly' and 'None'."; // Act - var ex = await Assert.ThrowsAsync(() => - validationSummaryTagHelper.ProcessAsync(context: null, output: output)); + var ex = await Assert.ThrowsAsync( + () => validationSummaryTagHelper.ProcessAsync(context: null, output: output)); // Assert Assert.Equal(expectedMessage, ex.Message);