Skip to content
This repository was archived by the owner on Dec 14, 2018. It is now read-only.

Commit f8f08f0

Browse files
author
N. Taylor Mullen
committed
Fix tests and changed TagHelper activates property accessors.
- Changed TagHelper property accessors from private to protected internal. - Changed throw tests to be shorter. - Changed reflection setting to now use the internal accessibility of the TagHelpers - Removed activator to just use internal accessibility of TagHelpers. - Changed new StringWriter() instances where we didn't need the StringWriter to be TextWriter.Null
1 parent f8b0249 commit f8f08f0

11 files changed

+64
-127
lines changed

src/Microsoft.AspNet.Mvc.TagHelpers/AnchorTagHelper.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,9 @@ public class AnchorTagHelper : TagHelper
1818
private const string RouteAttributePrefix = "route-";
1919
private const string Href = "href";
2020

21+
// Protected to ensure subclasses are correctly activated. Internal for ease of use when testing.
2122
[Activate]
22-
private IHtmlGenerator Generator { get; set; }
23+
protected internal IHtmlGenerator Generator { get; set; }
2324

2425
/// <summary>
2526
/// The name of the action method.

src/Microsoft.AspNet.Mvc.TagHelpers/FormTagHelper.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,13 @@ public class FormTagHelper : TagHelper
1818
{
1919
private const string RouteAttributePrefix = "route-";
2020

21+
// Protected to ensure subclasses are correctly activated. Internal for ease of use when testing.
2122
[Activate]
22-
private ViewContext ViewContext { get; set; }
23+
protected internal ViewContext ViewContext { get; set; }
2324

25+
// Protected to ensure subclasses are correctly activated. Internal for ease of use when testing.
2426
[Activate]
25-
private IHtmlGenerator Generator { get; set; }
27+
protected internal IHtmlGenerator Generator { get; set; }
2628

2729
/// <summary>
2830
/// The name of the action method.

src/Microsoft.AspNet.Mvc.TagHelpers/TextAreaTagHelper.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,13 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
1313
[ContentBehavior(ContentBehavior.Replace)]
1414
public class TextAreaTagHelper : TagHelper
1515
{
16+
// Protected to ensure subclasses are correctly activated. Internal for ease of use when testing.
1617
[Activate]
17-
private IHtmlGenerator Generator { get; set; }
18+
protected internal IHtmlGenerator Generator { get; set; }
1819

20+
// Protected to ensure subclasses are correctly activated. Internal for ease of use when testing.
1921
[Activate]
20-
private ViewContext ViewContext { get; set; }
22+
protected internal ViewContext ViewContext { get; set; }
2123

2224
/// <summary>
2325
/// An expression to be evaluated against the current model.

src/Microsoft.AspNet.Mvc.TagHelpers/ValidationMessageTagHelper.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,13 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
1414
[ContentBehavior(ContentBehavior.Modify)]
1515
public class ValidationMessageTagHelper : TagHelper
1616
{
17+
// Protected to ensure subclasses are correctly activated. Internal for ease of use when testing.
1718
[Activate]
18-
private ViewContext ViewContext { get; set; }
19+
protected internal ViewContext ViewContext { get; set; }
1920

21+
// Protected to ensure subclasses are correctly activated. Internal for ease of use when testing.
2022
[Activate]
21-
private IHtmlGenerator Generator { get; set; }
23+
protected internal IHtmlGenerator Generator { get; set; }
2224

2325
/// <summary>
2426
/// Name to be validated on the current model.

test/Microsoft.AspNet.Mvc.TagHelpers.Test/AnchorTagHelperTest.cs

Lines changed: 5 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,8 @@
33

44
using System;
55
using System.Collections.Generic;
6-
using System.Reflection;
76
using System.Threading.Tasks;
87
using Microsoft.AspNet.Mvc.ModelBinding;
9-
using Microsoft.AspNet.Mvc.Razor;
108
using Microsoft.AspNet.Mvc.Rendering;
119
using Microsoft.AspNet.Razor.Runtime.TagHelpers;
1210
using Moq;
@@ -65,9 +63,7 @@ public async Task ProcessAsync_GeneratesExpectedOutput()
6563
var viewContext = TestableHtmlGenerator.GetViewContext(model: null,
6664
htmlGenerator: htmlGenerator,
6765
metadataProvider: metadataProvider);
68-
69-
var activator = new DefaultTagHelperActivator();
70-
activator.Activate(anchorTagHelper, viewContext);
66+
anchorTagHelper.Generator = htmlGenerator;
7167

7268
// Act
7369
await anchorTagHelper.ProcessAsync(tagHelperContext, output);
@@ -106,8 +102,7 @@ public async Task ProcessAsync_CallsIntoRouteLinkWithExpectedParameters()
106102
string.Empty, "Default", "http", "contoso.com", "hello=world", null, null))
107103
.Returns(new TagBuilder("a"))
108104
.Verifiable();
109-
110-
SetGenerator(anchorTagHelper, generator.Object);
105+
anchorTagHelper.Generator = generator.Object;
111106

112107
// Act & Assert
113108
await anchorTagHelper.ProcessAsync(context, output);
@@ -142,8 +137,7 @@ public async Task ProcessAsync_CallsIntoActionLinkWithExpectedParameters()
142137
string.Empty, "Index", "Home", "http", "contoso.com", "hello=world", null, null))
143138
.Returns(new TagBuilder("a"))
144139
.Verifiable();
145-
146-
SetGenerator(anchorTagHelper, generator.Object);
140+
anchorTagHelper.Generator = generator.Object;
147141

148142
// Act & Assert
149143
await anchorTagHelper.ProcessAsync(context, output);
@@ -188,10 +182,7 @@ public async Task ProcessAsync_ThrowsIfHrefConflictsWithBoundAttributes(string p
188182

189183
// Act & Assert
190184
var ex = await Assert.ThrowsAsync<InvalidOperationException>(
191-
async () =>
192-
{
193-
await anchorTagHelper.ProcessAsync(context: null, output: output);
194-
});
185+
() => anchorTagHelper.ProcessAsync(context: null, output: output));
195186

196187
Assert.Equal(expectedErrorMessage, ex.Message);
197188
}
@@ -216,20 +207,9 @@ public async Task ProcessAsync_ThrowsIfRouteAndActionOrControllerProvided(string
216207

217208
// Act & Assert
218209
var ex = await Assert.ThrowsAsync<InvalidOperationException>(
219-
async () =>
220-
{
221-
await anchorTagHelper.ProcessAsync(context: null, output: output);
222-
});
210+
() => anchorTagHelper.ProcessAsync(context: null, output: output));
223211

224212
Assert.Equal(expectedErrorMessage, ex.Message);
225213
}
226-
227-
private void SetGenerator(ITagHelper tagHelper, IHtmlGenerator generator)
228-
{
229-
var tagHelperType = tagHelper.GetType();
230-
231-
tagHelperType.GetProperty("Generator", BindingFlags.NonPublic | BindingFlags.Instance)
232-
.SetValue(tagHelper, generator);
233-
}
234214
}
235215
}

test/Microsoft.AspNet.Mvc.TagHelpers.Test/FormTagHelperTest.cs

Lines changed: 18 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,10 @@
44
using System;
55
using System.Collections.Generic;
66
using System.IO;
7-
using System.Reflection;
87
using System.Threading.Tasks;
9-
using Microsoft.AspNet.Http;
108
using Microsoft.AspNet.Mvc.ModelBinding;
11-
using Microsoft.AspNet.Mvc.Razor;
129
using Microsoft.AspNet.Mvc.Rendering;
10+
using Microsoft.AspNet.PipelineCore;
1311
using Microsoft.AspNet.Razor.Runtime.TagHelpers;
1412
using Microsoft.AspNet.Routing;
1513
using Moq;
@@ -65,8 +63,8 @@ public async Task ProcessAsync_GeneratesExpectedOutput()
6563
metadataProvider: metadataProvider);
6664
var expectedContent = "Something" + htmlGenerator.GenerateAntiForgery(viewContext)
6765
.ToString(TagRenderMode.SelfClosing);
68-
var activator = new DefaultTagHelperActivator();
69-
activator.Activate(formTagHelper, viewContext);
66+
formTagHelper.ViewContext = viewContext;
67+
formTagHelper.Generator = htmlGenerator;
7068

7169
// Act
7270
await formTagHelper.ProcessAsync(tagHelperContext, output);
@@ -115,8 +113,8 @@ public async Task ProcessAsync_GeneratesAntiForgeryCorrectly(bool? antiForgery,
115113

116114
generator.Setup(mock => mock.GenerateAntiForgery(viewContext))
117115
.Returns(new TagBuilder("input"));
118-
119-
SetViewContextAndGenerator(formTagHelper, viewContext, generator.Object);
116+
formTagHelper.ViewContext = viewContext;
117+
formTagHelper.Generator = generator.Object;
120118

121119
// Act
122120
await formTagHelper.ProcessAsync(context, output);
@@ -175,8 +173,8 @@ public async Task ProcessAsync_BindsRouteValuesFromTagHelperOutput()
175173
})
176174
.Returns(new TagBuilder("form"))
177175
.Verifiable();
178-
179-
SetViewContextAndGenerator(formTagHelper, testViewContext, generator.Object);
176+
formTagHelper.ViewContext = testViewContext;
177+
formTagHelper.Generator = generator.Object;
180178

181179
// Act & Assert
182180
await formTagHelper.ProcessAsync(context, output);
@@ -211,10 +209,8 @@ public async Task ProcessAsync_CallsIntoGenerateFormWithExpectedParameters()
211209
.Setup(mock => mock.GenerateForm(viewContext, "Index", "Home", null, "POST", null))
212210
.Returns(new TagBuilder("form"))
213211
.Verifiable();
214-
215-
SetViewContextAndGenerator(formTagHelper,
216-
viewContext,
217-
generator.Object);
212+
formTagHelper.ViewContext = viewContext;
213+
formTagHelper.Generator = generator.Object;
218214

219215
// Act & Assert
220216
await formTagHelper.ProcessAsync(context, output);
@@ -273,9 +269,9 @@ public async Task ProcessAsync_SupportsAntiForgeryIfActionIsURL(bool? antiForger
273269
Action = "http://www.contoso.com",
274270
AntiForgery = antiForgery,
275271
};
276-
SetViewContextAndGenerator(formTagHelper,
277-
viewContext,
278-
generator.Object);
272+
formTagHelper.ViewContext = viewContext;
273+
formTagHelper.Generator = generator.Object;
274+
279275
var output = new TagHelperOutput("form",
280276
attributes: new Dictionary<string, string>(),
281277
content: string.Empty);
@@ -313,10 +309,8 @@ public async Task ProcessAsync_ThrowsIfActionIsUrlWithSpecifiedController()
313309
content: string.Empty);
314310

315311
// Act & Assert
316-
var ex = await Assert.ThrowsAsync<InvalidOperationException>(async () =>
317-
{
318-
await formTagHelper.ProcessAsync(context: null, output: tagHelperOutput);
319-
});
312+
var ex = await Assert.ThrowsAsync<InvalidOperationException>(
313+
() => formTagHelper.ProcessAsync(context: null, output: tagHelperOutput));
320314

321315
Assert.Equal(expectedErrorMessage, ex.Message);
322316
}
@@ -341,18 +335,16 @@ public async Task ProcessAsync_ThrowsIfActionIsUrlWithSpecifiedRoutes()
341335
content: string.Empty);
342336

343337
// Act & Assert
344-
var ex = await Assert.ThrowsAsync<InvalidOperationException>(async () =>
345-
{
346-
await formTagHelper.ProcessAsync(context: null, output: tagHelperOutput);
347-
});
338+
var ex = await Assert.ThrowsAsync<InvalidOperationException>(
339+
() => formTagHelper.ProcessAsync(context: null, output: tagHelperOutput));
348340

349341
Assert.Equal(expectedErrorMessage, ex.Message);
350342
}
351343

352344
private static ViewContext CreateViewContext()
353345
{
354346
var actionContext = new ActionContext(
355-
new Mock<HttpContext>().Object,
347+
new DefaultHttpContext(),
356348
new RouteData(),
357349
new ActionDescriptor());
358350

@@ -361,19 +353,7 @@ private static ViewContext CreateViewContext()
361353
Mock.Of<IView>(),
362354
new ViewDataDictionary(
363355
new DataAnnotationsModelMetadataProvider()),
364-
new StringWriter());
365-
}
366-
367-
private static void SetViewContextAndGenerator(ITagHelper tagHelper,
368-
ViewContext viewContext,
369-
IHtmlGenerator generator)
370-
{
371-
var tagHelperType = tagHelper.GetType();
372-
373-
tagHelperType.GetProperty("ViewContext", BindingFlags.NonPublic | BindingFlags.Instance)
374-
.SetValue(tagHelper, viewContext);
375-
tagHelperType.GetProperty("Generator", BindingFlags.NonPublic | BindingFlags.Instance)
376-
.SetValue(tagHelper, generator);
356+
TextWriter.Null);
377357
}
378358
}
379359
}

test/Microsoft.AspNet.Mvc.TagHelpers.Test/LabelTagHelperTest.cs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
using System.Collections.Generic;
66
using System.Threading.Tasks;
77
using Microsoft.AspNet.Mvc.ModelBinding;
8-
using Microsoft.AspNet.Mvc.Razor;
98
using Microsoft.AspNet.Mvc.Rendering;
109
using Microsoft.AspNet.Razor.Runtime.TagHelpers;
1110
using Xunit;
@@ -160,8 +159,8 @@ public async Task TagHelper_LeavesOutputUnchanged_IfForNotBound2()
160159
var htmlGenerator = new TestableHtmlGenerator(metadataProvider);
161160
Model model = null;
162161
var viewContext = TestableHtmlGenerator.GetViewContext(model, htmlGenerator, metadataProvider);
163-
var activator = new DefaultTagHelperActivator();
164-
activator.Activate(tagHelper, viewContext);
162+
tagHelper.ViewContext = viewContext;
163+
tagHelper.Generator = htmlGenerator;
165164

166165
// Act
167166
await tagHelper.ProcessAsync(tagHelperContext, output);

test/Microsoft.AspNet.Mvc.TagHelpers.Test/TestableHtmlGenerator.cs

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@
44
using System;
55
using System.Collections.Generic;
66
using System.IO;
7-
using Microsoft.AspNet.Http;
87
using Microsoft.AspNet.Mvc.ModelBinding;
98
using Microsoft.AspNet.Mvc.Rendering;
9+
using Microsoft.AspNet.PipelineCore;
1010
using Microsoft.AspNet.Routing;
1111
using Microsoft.AspNet.Security.DataProtection;
1212
using Microsoft.Framework.OptionsModel;
@@ -50,22 +50,12 @@ public static ViewContext GetViewContext(
5050
IHtmlGenerator htmlGenerator,
5151
IModelMetadataProvider metadataProvider)
5252
{
53-
var serviceProvider = new Mock<IServiceProvider>();
54-
serviceProvider
55-
.Setup(provider => provider.GetService(typeof(IHtmlGenerator)))
56-
.Returns(htmlGenerator);
57-
58-
var httpContext = new Mock<HttpContext>();
59-
httpContext
60-
.Setup(context => context.RequestServices)
61-
.Returns(serviceProvider.Object);
62-
63-
var actionContext = new ActionContext(httpContext.Object, new RouteData(), new ActionDescriptor());
53+
var actionContext = new ActionContext(new DefaultHttpContext(), new RouteData(), new ActionDescriptor());
6454
var viewData = new ViewDataDictionary(metadataProvider)
6555
{
6656
Model = model,
6757
};
68-
var viewContext = new ViewContext(actionContext, Mock.Of<IView>(), viewData, new StringWriter());
58+
var viewContext = new ViewContext(actionContext, Mock.Of<IView>(), viewData, TextWriter.Null);
6959

7060
return viewContext;
7161
}

test/Microsoft.AspNet.Mvc.TagHelpers.Test/TextAreaTagHelperTest.cs

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
using System.Collections.Generic;
66
using System.Threading.Tasks;
77
using Microsoft.AspNet.Mvc.ModelBinding;
8-
using Microsoft.AspNet.Mvc.Razor;
98
using Microsoft.AspNet.Mvc.Rendering;
109
using Microsoft.AspNet.Razor.Runtime.TagHelpers;
1110
using Xunit;
@@ -57,8 +56,8 @@ public static TheoryData<object, Type, Func<object>, string, string> TestDataSet
5756
{ modelWithText, typeof(NestedModel), () => modelWithText.NestedModel.Text, "NestedModel.Text",
5857
Environment.NewLine + "inner text" },
5958

60-
// Top-level indexing does not work end-to-end due to code generation issue #1345.
61-
// TODO: Remove above comment when #1345 is fixed.
59+
// Top-level indexing does not work end-to-end due to code generation issue #1345.
60+
// TODO: Remove above comment when #1345 is fixed.
6261
{ models, typeof(Model), () => models[0].Text, "[0].Text",
6362
Environment.NewLine },
6463
{ models, typeof(Model), () => models[1].Text, "[1].Text",
@@ -119,8 +118,8 @@ public async Task Process_GeneratesExpectedOutput(
119118
}
120119
};
121120
var viewContext = TestableHtmlGenerator.GetViewContext(model, htmlGenerator, metadataProvider);
122-
var activator = new DefaultTagHelperActivator();
123-
activator.Activate(tagHelper, viewContext);
121+
tagHelper.ViewContext = viewContext;
122+
tagHelper.Generator = htmlGenerator;
124123

125124
// Act
126125
await tagHelper.ProcessAsync(tagHelperContext, output);
@@ -166,8 +165,8 @@ public async Task TagHelper_LeavesOutputUnchanged_IfForNotBound()
166165
};
167166
Model model = null;
168167
var viewContext = TestableHtmlGenerator.GetViewContext(model, htmlGenerator, metadataProvider);
169-
var activator = new DefaultTagHelperActivator();
170-
activator.Activate(tagHelper, viewContext);
168+
tagHelper.ViewContext = viewContext;
169+
tagHelper.Generator = htmlGenerator;
171170

172171
// Act
173172
await tagHelper.ProcessAsync(tagHelperContext, output);

0 commit comments

Comments
 (0)