[Fixes #2085] Using custom HtmlEncoder in unit tests

This commit is contained in:
Ajay Bhargav Baaskaran 2015-04-17 17:18:25 -07:00
parent 017e44ae95
commit 5da8ba7769
23 changed files with 229 additions and 199 deletions

View File

@ -78,6 +78,10 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
{
selected = selectedValues.Contains(Value);
}
else if (output.IsContentModified)
{
selected = encodedValues.Contains(output.Content.GetContent());
}
else
{
var childContent = await context.GetChildContentAsync();

View File

@ -8,7 +8,7 @@ using System.Threading.Tasks;
using Microsoft.AspNet.Http;
using Microsoft.AspNet.Http.Collections;
using Microsoft.AspNet.Mvc.Rendering;
using Microsoft.Framework.WebEncoders;
using Microsoft.Framework.WebEncoders.Testing;
using Moq;
using Xunit;
@ -36,7 +36,7 @@ namespace Microsoft.AspNet.Mvc.Core.Test
tokenStore: null,
generator: null,
validator: null,
htmlEncoder: new HtmlEncoder());
htmlEncoder: new CommonTestEncoder());
// Act & assert
var ex =
@ -68,7 +68,7 @@ namespace Microsoft.AspNet.Mvc.Core.Test
tokenStore: null,
generator: null,
validator: null,
htmlEncoder: new HtmlEncoder());
htmlEncoder: new CommonTestEncoder());
// Act & assert
var ex = Assert.Throws<InvalidOperationException>(
@ -98,7 +98,7 @@ namespace Microsoft.AspNet.Mvc.Core.Test
tokenStore: null,
generator: null,
validator: null,
htmlEncoder: new HtmlEncoder());
htmlEncoder: new CommonTestEncoder());
// Act & assert
var ex = Assert.Throws<InvalidOperationException>(() => worker.GetFormInputElement(mockHttpContext.Object));
@ -127,7 +127,7 @@ namespace Microsoft.AspNet.Mvc.Core.Test
tokenStore: null,
generator: null,
validator: null,
htmlEncoder: new HtmlEncoder());
htmlEncoder: new CommonTestEncoder());
// Act & assert
var ex = Assert.Throws<InvalidOperationException>(() => worker.GetTokens(mockHttpContext.Object, "cookie-token"));
@ -154,7 +154,8 @@ namespace Microsoft.AspNet.Mvc.Core.Test
var inputElement = worker.GetFormInputElement(context.HttpContext.Object);
// Assert
Assert.Equal(@"<input name=""form-field-name"" type=""hidden"" value=""serialized-form-token"" />",
Assert.Equal(@"<input name=""HtmlEncode[[form-field-name]]"" type=""HtmlEncode[[hidden]]"" " +
@"value=""HtmlEncode[[serialized-form-token]]"" />",
inputElement.ToString(TagRenderMode.SelfClosing));
context.TokenStore.Verify();
}
@ -184,7 +185,8 @@ namespace Microsoft.AspNet.Mvc.Core.Test
var inputElement = worker.GetFormInputElement(context.HttpContext.Object);
// Assert
Assert.Equal(@"<input name=""form-field-name"" type=""hidden"" value=""serialized-form-token"" />",
Assert.Equal(@"<input name=""HtmlEncode[[form-field-name]]"" type=""HtmlEncode[[hidden]]"" " +
@"value=""HtmlEncode[[serialized-form-token]]"" />",
inputElement.ToString(TagRenderMode.SelfClosing));
context.TokenStore.Verify();
}
@ -206,7 +208,8 @@ namespace Microsoft.AspNet.Mvc.Core.Test
var inputElement = worker.GetFormInputElement(context.HttpContext.Object);
// Assert
Assert.Equal(@"<input name=""form-field-name"" type=""hidden"" value=""serialized-form-token"" />",
Assert.Equal(@"<input name=""HtmlEncode[[form-field-name]]"" type=""HtmlEncode[[hidden]]"" " +
@"value=""HtmlEncode[[serialized-form-token]]"" />",
inputElement.ToString(TagRenderMode.SelfClosing));
}
@ -415,7 +418,7 @@ namespace Microsoft.AspNet.Mvc.Core.Test
tokenStore: context.TokenStore != null ? context.TokenStore.Object : null,
generator: context.TokenProvider != null ? context.TokenProvider.Object : null,
validator: context.TokenProvider != null ? context.TokenProvider.Object : null,
htmlEncoder: new HtmlEncoder());
htmlEncoder: new CommonTestEncoder());
}
private Mock<HttpContext> GetHttpContext(bool setupResponse = true)

View File

@ -4,7 +4,7 @@
using Microsoft.AspNet.DataProtection;
using Microsoft.Framework.DependencyInjection;
using Microsoft.Framework.OptionsModel;
using Microsoft.Framework.WebEncoders;
using Microsoft.Framework.WebEncoders.Testing;
using Moq;
using Xunit;
@ -44,7 +44,7 @@ namespace Microsoft.AspNet.Mvc.Core.Test
dataProtectionProvider.Object,
additionalDataProvider.Object,
optionsAccessor.Object,
new HtmlEncoder(),
new CommonTestEncoder(),
mockDataProtectionOptions.Object);
}
}

View File

@ -3,7 +3,7 @@
using System.Collections.Generic;
using System.IO;
using Microsoft.Framework.WebEncoders;
using Microsoft.Framework.WebEncoders.Testing;
using Moq;
using Xunit;
@ -276,7 +276,7 @@ namespace Microsoft.AspNet.Mvc.Rendering
public void BeginFormWithNoParameters_CallsHtmlGeneratorWithExpectedValues()
{
// Arrange
var tagBuilder = new TagBuilder(tagName: "form", htmlEncoder: new HtmlEncoder());
var tagBuilder = new TagBuilder(tagName: "form", htmlEncoder: new NullTestEncoder());
var htmlGenerator = new Mock<IHtmlGenerator>(MockBehavior.Strict);
var htmlHelper = DefaultTemplatesUtilities.GetHtmlHelper(htmlGenerator.Object);
htmlGenerator
@ -310,7 +310,7 @@ namespace Microsoft.AspNet.Mvc.Rendering
public void BeginFormWithMethodParameter_CallsHtmlGeneratorWithExpectedValues(FormMethod method)
{
// Arrange
var tagBuilder = new TagBuilder(tagName: "form", htmlEncoder: new HtmlEncoder());
var tagBuilder = new TagBuilder(tagName: "form", htmlEncoder: new NullTestEncoder());
var htmlGenerator = new Mock<IHtmlGenerator>(MockBehavior.Strict);
var htmlHelper = DefaultTemplatesUtilities.GetHtmlHelper(htmlGenerator.Object);
htmlGenerator
@ -346,7 +346,7 @@ namespace Microsoft.AspNet.Mvc.Rendering
object htmlAttributes)
{
// Arrange
var tagBuilder = new TagBuilder(tagName: "form", htmlEncoder: new HtmlEncoder());
var tagBuilder = new TagBuilder(tagName: "form", htmlEncoder: new NullTestEncoder());
var htmlGenerator = new Mock<IHtmlGenerator>(MockBehavior.Strict);
var htmlHelper = DefaultTemplatesUtilities.GetHtmlHelper(htmlGenerator.Object);
htmlGenerator
@ -380,7 +380,7 @@ namespace Microsoft.AspNet.Mvc.Rendering
public void BeginFormWithRouteValuesParameter_CallsHtmlGeneratorWithExpectedValues(object routeValues)
{
// Arrange
var tagBuilder = new TagBuilder(tagName: "form", htmlEncoder: new HtmlEncoder());
var tagBuilder = new TagBuilder(tagName: "form", htmlEncoder: new NullTestEncoder());
var htmlGenerator = new Mock<IHtmlGenerator>(MockBehavior.Strict);
var htmlHelper = DefaultTemplatesUtilities.GetHtmlHelper(htmlGenerator.Object);
htmlGenerator
@ -416,7 +416,7 @@ namespace Microsoft.AspNet.Mvc.Rendering
string controllerName)
{
// Arrange
var tagBuilder = new TagBuilder(tagName: "form", htmlEncoder: new HtmlEncoder());
var tagBuilder = new TagBuilder(tagName: "form", htmlEncoder: new NullTestEncoder());
var htmlGenerator = new Mock<IHtmlGenerator>(MockBehavior.Strict);
var htmlHelper = DefaultTemplatesUtilities.GetHtmlHelper(htmlGenerator.Object);
htmlGenerator
@ -453,7 +453,7 @@ namespace Microsoft.AspNet.Mvc.Rendering
object routeValues)
{
// Arrange
var tagBuilder = new TagBuilder(tagName: "form", htmlEncoder: new HtmlEncoder());
var tagBuilder = new TagBuilder(tagName: "form", htmlEncoder: new NullTestEncoder());
var htmlGenerator = new Mock<IHtmlGenerator>(MockBehavior.Strict);
var htmlHelper = DefaultTemplatesUtilities.GetHtmlHelper(htmlGenerator.Object);
htmlGenerator
@ -490,7 +490,7 @@ namespace Microsoft.AspNet.Mvc.Rendering
FormMethod method)
{
// Arrange
var tagBuilder = new TagBuilder(tagName: "form", htmlEncoder: new HtmlEncoder());
var tagBuilder = new TagBuilder(tagName: "form", htmlEncoder: new NullTestEncoder());
var htmlGenerator = new Mock<IHtmlGenerator>(MockBehavior.Strict);
var htmlHelper = DefaultTemplatesUtilities.GetHtmlHelper(htmlGenerator.Object);
htmlGenerator
@ -528,7 +528,7 @@ namespace Microsoft.AspNet.Mvc.Rendering
FormMethod method)
{
// Arrange
var tagBuilder = new TagBuilder(tagName: "form", htmlEncoder: new HtmlEncoder());
var tagBuilder = new TagBuilder(tagName: "form", htmlEncoder: new NullTestEncoder());
var htmlGenerator = new Mock<IHtmlGenerator>(MockBehavior.Strict);
var htmlHelper = DefaultTemplatesUtilities.GetHtmlHelper(htmlGenerator.Object);
htmlGenerator
@ -566,7 +566,7 @@ namespace Microsoft.AspNet.Mvc.Rendering
object htmlAttributes)
{
// Arrange
var tagBuilder = new TagBuilder(tagName: "form", htmlEncoder: new HtmlEncoder());
var tagBuilder = new TagBuilder(tagName: "form", htmlEncoder: new NullTestEncoder());
var htmlGenerator = new Mock<IHtmlGenerator>(MockBehavior.Strict);
var htmlHelper = DefaultTemplatesUtilities.GetHtmlHelper(htmlGenerator.Object);
htmlGenerator
@ -600,7 +600,7 @@ namespace Microsoft.AspNet.Mvc.Rendering
public void BeginRouteFormWithRouteValuesParameter_CallsHtmlGeneratorWithExpectedValues(object routeValues)
{
// Arrange
var tagBuilder = new TagBuilder(tagName: "form", htmlEncoder: new HtmlEncoder());
var tagBuilder = new TagBuilder(tagName: "form", htmlEncoder: new NullTestEncoder());
var htmlGenerator = new Mock<IHtmlGenerator>(MockBehavior.Strict);
var htmlHelper = DefaultTemplatesUtilities.GetHtmlHelper(htmlGenerator.Object);
htmlGenerator
@ -633,7 +633,7 @@ namespace Microsoft.AspNet.Mvc.Rendering
public void BeginRouteFormWithRouteNameParameter_CallsHtmlGeneratorWithExpectedValues(string routeName)
{
// Arrange
var tagBuilder = new TagBuilder(tagName: "form", htmlEncoder: new HtmlEncoder());
var tagBuilder = new TagBuilder(tagName: "form", htmlEncoder: new NullTestEncoder());
var htmlGenerator = new Mock<IHtmlGenerator>(MockBehavior.Strict);
var htmlHelper = DefaultTemplatesUtilities.GetHtmlHelper(htmlGenerator.Object);
htmlGenerator
@ -668,7 +668,7 @@ namespace Microsoft.AspNet.Mvc.Rendering
object routeValues)
{
// Arrange
var tagBuilder = new TagBuilder(tagName: "form", htmlEncoder: new HtmlEncoder());
var tagBuilder = new TagBuilder(tagName: "form", htmlEncoder: new NullTestEncoder());
var htmlGenerator = new Mock<IHtmlGenerator>(MockBehavior.Strict);
var htmlHelper = DefaultTemplatesUtilities.GetHtmlHelper(htmlGenerator.Object);
htmlGenerator
@ -703,7 +703,7 @@ namespace Microsoft.AspNet.Mvc.Rendering
FormMethod method)
{
// Arrange
var tagBuilder = new TagBuilder(tagName: "form", htmlEncoder: new HtmlEncoder());
var tagBuilder = new TagBuilder(tagName: "form", htmlEncoder: new NullTestEncoder());
var htmlGenerator = new Mock<IHtmlGenerator>(MockBehavior.Strict);
var htmlHelper = DefaultTemplatesUtilities.GetHtmlHelper(htmlGenerator.Object);
htmlGenerator
@ -739,7 +739,7 @@ namespace Microsoft.AspNet.Mvc.Rendering
FormMethod method)
{
// Arrange
var tagBuilder = new TagBuilder(tagName: "form", htmlEncoder: new HtmlEncoder());
var tagBuilder = new TagBuilder(tagName: "form", htmlEncoder: new NullTestEncoder());
var htmlGenerator = new Mock<IHtmlGenerator>(MockBehavior.Strict);
var htmlHelper = DefaultTemplatesUtilities.GetHtmlHelper(htmlGenerator.Object);
htmlGenerator
@ -775,7 +775,7 @@ namespace Microsoft.AspNet.Mvc.Rendering
object htmlAttributes)
{
// Arrange
var tagBuilder = new TagBuilder(tagName: "form", htmlEncoder: new HtmlEncoder());
var tagBuilder = new TagBuilder(tagName: "form", htmlEncoder: new NullTestEncoder());
var htmlGenerator = new Mock<IHtmlGenerator>(MockBehavior.Strict);
var htmlHelper = DefaultTemplatesUtilities.GetHtmlHelper(htmlGenerator.Object);
htmlGenerator

View File

@ -3,7 +3,7 @@
using System.Collections.Generic;
using Microsoft.AspNet.Mvc.Rendering;
using Microsoft.Framework.WebEncoders;
using Microsoft.Framework.WebEncoders.Testing;
using Xunit;
namespace Microsoft.AspNet.Mvc.Core.Rendering
@ -29,7 +29,7 @@ namespace Microsoft.AspNet.Mvc.Core.Rendering
public void MergeAttribute_IgnoresCase(bool replaceExisting, string expectedKey, string expectedValue)
{
// Arrange
var tagBuilder = new TagBuilder("p", new HtmlEncoder());
var tagBuilder = new TagBuilder("p", new NullTestEncoder());
tagBuilder.Attributes.Add("Hello", "World");
// Act
@ -44,7 +44,7 @@ namespace Microsoft.AspNet.Mvc.Core.Rendering
public void AddCssClass_IgnoresCase()
{
// Arrange
var tagBuilder = new TagBuilder("p", new HtmlEncoder());
var tagBuilder = new TagBuilder("p", new NullTestEncoder());
tagBuilder.Attributes.Add("ClaSs", "btn");
// Act
@ -59,7 +59,7 @@ namespace Microsoft.AspNet.Mvc.Core.Rendering
public void GenerateId_IgnoresCase()
{
// Arrange
var tagBuilder = new TagBuilder("p", new HtmlEncoder());
var tagBuilder = new TagBuilder("p", new NullTestEncoder());
tagBuilder.Attributes.Add("ID", "something");
// Act
@ -75,7 +75,7 @@ namespace Microsoft.AspNet.Mvc.Core.Rendering
public void ToString_IgnoresIdAttributeCase(TagRenderMode renderingMode, string expectedOutput)
{
// Arrange
var tagBuilder = new TagBuilder("p", new HtmlEncoder());
var tagBuilder = new TagBuilder("p", new NullTestEncoder());
// An empty value id attribute should not be rendered via ToString.
tagBuilder.Attributes.Add("ID", string.Empty);
@ -92,7 +92,7 @@ namespace Microsoft.AspNet.Mvc.Core.Rendering
public void ToHtmlString_IgnoresIdAttributeCase(TagRenderMode renderingMode, string expectedOutput)
{
// Arrange
var tagBuilder = new TagBuilder("p", new HtmlEncoder());
var tagBuilder = new TagBuilder("p", new NullTestEncoder());
// An empty value id attribute should not be rendered via ToHtmlString.
tagBuilder.Attributes.Add("ID", string.Empty);
@ -103,5 +103,18 @@ namespace Microsoft.AspNet.Mvc.Core.Rendering
// Assert
Assert.Equal(expectedOutput, value.ToString());
}
[Fact]
public void SetInnerText_HtmlEncodesValue()
{
// Arrange
var tagBuilder = new TagBuilder("p", new CommonTestEncoder());
// Act
tagBuilder.SetInnerText("TestValue");
// Assert
Assert.Equal("HtmlEncode[[TestValue]]", tagBuilder.InnerHtml);
}
}
}

View File

@ -8,6 +8,7 @@
"Microsoft.AspNet.Mvc.Xml": "6.0.0-*",
"Microsoft.AspNet.Testing": "1.0.0-*",
"Microsoft.Framework.Logging.Testing": "1.0.0-*",
"Microsoft.Framework.WebEncoders.Testing": "1.0.0-*",
"Moq": "4.2.1312.1622",
"xunit.runner.aspnet": "2.0.0-aspnet-*"
},

View File

@ -9,8 +9,8 @@ using Microsoft.AspNet.Http;
using Microsoft.AspNet.Mvc.ModelBinding;
using Microsoft.AspNet.Mvc.Rendering;
using Microsoft.AspNet.Routing;
using Microsoft.Framework.DependencyInjection;
using Microsoft.Framework.WebEncoders;
using Microsoft.Framework.WebEncoders.Testing;
using Moq;
using Xunit;
@ -27,7 +27,7 @@ namespace Microsoft.AspNet.Mvc.Razor
var myService = new MyService();
var helper = Mock.Of<IHtmlHelper<object>>();
var htmlEncoder = new HtmlEncoder();
var htmlEncoder = new CommonTestEncoder();
var serviceProvider = new Mock<IServiceProvider>();
serviceProvider.Setup(p => p.GetService(typeof(MyService)))
.Returns(myService);
@ -96,7 +96,7 @@ namespace Microsoft.AspNet.Mvc.Razor
var myService = new MyService();
var helper = Mock.Of<IHtmlHelper<object>>();
var htmlEncoder = new HtmlEncoder();
var htmlEncoder = new CommonTestEncoder();
var serviceProvider = new Mock<IServiceProvider>();
serviceProvider.Setup(p => p.GetService(typeof(MyService)))
.Returns(myService);
@ -134,7 +134,7 @@ namespace Microsoft.AspNet.Mvc.Razor
var instance = new TestRazorPage();
var myService = new MyService();
var helper = Mock.Of<IHtmlHelper<object>>();
var htmlEncoder = new HtmlEncoder();
var htmlEncoder = new CommonTestEncoder();
var serviceProvider = new Mock<IServiceProvider>();
serviceProvider.Setup(p => p.GetService(typeof(MyService)))
.Returns(myService);
@ -172,7 +172,7 @@ namespace Microsoft.AspNet.Mvc.Razor
var instance = new DoesNotDeriveFromRazorPageOfTButHasModelProperty();
var myService = new MyService();
var helper = Mock.Of<IHtmlHelper<object>>();
var htmlEncoder = new HtmlEncoder();
var htmlEncoder = new CommonTestEncoder();
var serviceProvider = new Mock<IServiceProvider>();
serviceProvider.Setup(p => p.GetService(typeof(MyService)))
.Returns(myService);

View File

@ -11,7 +11,7 @@ using Microsoft.AspNet.Mvc.Rendering;
using Microsoft.AspNet.PageExecutionInstrumentation;
using Microsoft.AspNet.Razor.Runtime.TagHelpers;
using Microsoft.AspNet.Testing;
using Microsoft.Framework.WebEncoders;
using Microsoft.Framework.WebEncoders.Testing;
using Moq;
using Xunit;
@ -30,7 +30,7 @@ namespace Microsoft.AspNet.Mvc.Razor
var viewContext = CreateViewContext();
var page = CreatePage(v =>
{
v.HtmlEncoder = new HtmlEncoder();
v.HtmlEncoder = new CommonTestEncoder();
v.Write("Hello Prefix");
v.StartTagHelperWritingScope();
v.Write("Hello from Output");
@ -44,7 +44,8 @@ namespace Microsoft.AspNet.Mvc.Razor
var pageOutput = page.Output.ToString();
// Assert
Assert.Equal("Hello PrefixFrom Scope: Hello from OutputHello from view context writer", pageOutput);
Assert.Equal("HtmlEncode[[Hello Prefix]]HtmlEncode[[From Scope: HtmlEncode[[Hello from Output]]" +
"Hello from view context writer]]", pageOutput);
}
[Fact]
@ -54,7 +55,7 @@ namespace Microsoft.AspNet.Mvc.Razor
var viewContext = CreateViewContext();
var page = CreatePage(v =>
{
v.HtmlEncoder = new HtmlEncoder();
v.HtmlEncoder = new CommonTestEncoder();
v.Write("Hello Prefix");
v.StartTagHelperWritingScope();
v.Write("Hello In Scope");
@ -67,7 +68,7 @@ namespace Microsoft.AspNet.Mvc.Razor
var pageOutput = page.Output.ToString();
// Assert
Assert.Equal("Hello PrefixFrom Scope: Hello In Scope", pageOutput);
Assert.Equal("HtmlEncode[[Hello Prefix]]HtmlEncode[[From Scope: HtmlEncode[[Hello In Scope]]]]", pageOutput);
}
[Fact]
@ -77,7 +78,7 @@ namespace Microsoft.AspNet.Mvc.Razor
var viewContext = CreateViewContext();
var page = CreatePage(v =>
{
v.HtmlEncoder = new HtmlEncoder();
v.HtmlEncoder = new CommonTestEncoder();
v.Write("Hello Prefix");
v.StartTagHelperWritingScope();
v.Write("Hello In Scope Pre Nest");
@ -97,7 +98,8 @@ namespace Microsoft.AspNet.Mvc.Razor
var pageOutput = page.Output.ToString();
// Assert
Assert.Equal("Hello PrefixFrom Scopes: Hello In Scope Pre NestHello In Scope Post NestHello In Nested Scope", pageOutput);
Assert.Equal("HtmlEncode[[Hello Prefix]]HtmlEncode[[From Scopes: HtmlEncode[[Hello In Scope Pre Nest]]" +
"HtmlEncode[[Hello In Scope Post Nest]]HtmlEncode[[Hello In Nested Scope]]]]", pageOutput);
}
[Fact]
@ -148,14 +150,14 @@ namespace Microsoft.AspNet.Mvc.Razor
// Act
var page = CreatePage(v =>
{
v.HtmlEncoder = new HtmlEncoder();
v.HtmlEncoder = new CommonTestEncoder();
v.StartTagHelperWritingScope();
v.Write("Hello World!");
var returnValue = v.EndTagHelperWritingScope();
// Assert
var content = Assert.IsType<DefaultTagHelperContent>(returnValue);
Assert.Equal("Hello World!", content.GetContent());
Assert.Equal("HtmlEncode[[Hello World!]]", content.GetContent());
});
await page.ExecuteAsync();
}
@ -169,7 +171,7 @@ namespace Microsoft.AspNet.Mvc.Razor
// Act
var page = CreatePage(v =>
{
v.HtmlEncoder = new HtmlEncoder();
v.HtmlEncoder = new CommonTestEncoder();
v.StartTagHelperWritingScope(new RazorTextWriter(TextWriter.Null, Encoding.UTF8));
v.Write("Hello ");
v.Write("World!");
@ -177,8 +179,8 @@ namespace Microsoft.AspNet.Mvc.Razor
// Assert
var content = Assert.IsType<DefaultTagHelperContent>(returnValue);
Assert.Equal("Hello World!", content.GetContent());
Assert.Equal(new[] { "Hello ", "World!" }, content.AsArray());
Assert.Equal("HtmlEncode[[Hello ]]HtmlEncode[[World!]]", content.GetContent());
Assert.Equal(new[] { "HtmlEncode[[Hello ]]", "HtmlEncode[[World!]]" }, content.AsArray());
}, viewContext);
await page.ExecuteAsync();
}
@ -545,7 +547,7 @@ namespace Microsoft.AspNet.Mvc.Razor
.Verifiable();
var page = CreatePage(v =>
{
v.HtmlEncoder = new HtmlEncoder();
v.HtmlEncoder = new CommonTestEncoder();
v.Write(v.Href("url"));
});
var services = new Mock<IServiceProvider>();
@ -558,7 +560,7 @@ namespace Microsoft.AspNet.Mvc.Razor
// Assert
var actual = page.RenderedContent;
Assert.Equal(expected, actual);
Assert.Equal($"HtmlEncode[[{expected}]]", actual);
helper.Verify();
}
@ -649,7 +651,7 @@ namespace Microsoft.AspNet.Mvc.Razor
// Arrange
var page = CreatePage(p =>
{
p.HtmlEncoder = new HtmlEncoder();
p.HtmlEncoder = new CommonTestEncoder();
p.WriteAttribute("href",
new PositionTagged<string>("prefix", 0),
new PositionTagged<string>("suffix", 34),
@ -787,7 +789,7 @@ namespace Microsoft.AspNet.Mvc.Razor
content: "Hello World!",
postContent: null,
postElement: null),
"<p test=\"testVal\">Hello World!</p>"
"<p test=\"HtmlEncode[[testVal]]\">Hello World!</p>"
},
{
GetTagHelperOutput(
@ -799,7 +801,7 @@ namespace Microsoft.AspNet.Mvc.Razor
content: "Hello World!",
postContent: null,
postElement: null),
"<p test=\"testVal\" something=\" spaced \">Hello World!</p>"
"<p test=\"HtmlEncode[[testVal]]\" something=\"HtmlEncode[[ spaced ]]\">Hello World!</p>"
},
{
GetTagHelperOutput(
@ -811,7 +813,7 @@ namespace Microsoft.AspNet.Mvc.Razor
content: "Hello World!",
postContent: null,
postElement: null),
"<p test=\"testVal\" />"
"<p test=\"HtmlEncode[[testVal]]\" />"
},
{
GetTagHelperOutput(
@ -823,7 +825,7 @@ namespace Microsoft.AspNet.Mvc.Razor
content: "Hello World!",
postContent: null,
postElement: null),
"<p test=\"testVal\" something=\" spaced \" />"
"<p test=\"HtmlEncode[[testVal]]\" something=\"HtmlEncode[[ spaced ]]\" />"
},
{
GetTagHelperOutput(
@ -955,7 +957,7 @@ namespace Microsoft.AspNet.Mvc.Razor
content: null,
postContent: null,
postElement: null),
"Before<custom test=\"testVal\" />"
"Before<custom test=\"HtmlEncode[[testVal]]\" />"
},
{
GetTagHelperOutput(
@ -1015,7 +1017,7 @@ namespace Microsoft.AspNet.Mvc.Razor
content: null,
postContent: null,
postElement: "After"),
"<custom test=\"testVal\" />After"
"<custom test=\"HtmlEncode[[testVal]]\" />After"
},
{
GetTagHelperOutput(
@ -1051,7 +1053,7 @@ namespace Microsoft.AspNet.Mvc.Razor
content: "Test",
postContent: "World!",
postElement: "After"),
"Before<custom test=\"testVal\">HelloTestWorld!</custom>After"
"Before<custom test=\"HtmlEncode[[testVal]]\">HelloTestWorld!</custom>After"
},
{
GetTagHelperOutput(
@ -1125,7 +1127,7 @@ namespace Microsoft.AspNet.Mvc.Razor
// Act
var page = CreatePage(p =>
{
p.HtmlEncoder = new HtmlEncoder();
p.HtmlEncoder = new CommonTestEncoder();
p.WriteTagHelperAsync(tagHelperExecutionContext).Wait();
}, context);
await page.ExecuteAsync();
@ -1167,7 +1169,7 @@ namespace Microsoft.AspNet.Mvc.Razor
// Act
var page = CreatePage(p =>
{
p.HtmlEncoder = new HtmlEncoder();
p.HtmlEncoder = new CommonTestEncoder();
p.WriteTagHelperAsync(tagHelperExecutionContext).Wait();
}, context);
await page.ExecuteAsync();
@ -1224,7 +1226,7 @@ namespace Microsoft.AspNet.Mvc.Razor
// Act
var page = CreatePage(p =>
{
p.HtmlEncoder = new HtmlEncoder();
p.HtmlEncoder = new CommonTestEncoder();
p.WriteTagHelperToAsync(writer, tagHelperExecutionContext).Wait();
}, context);
await page.ExecuteAsync();

View File

@ -9,7 +9,7 @@ using System.Threading.Tasks;
using Microsoft.AspNet.Http;
using Microsoft.AspNet.Mvc.ModelBinding;
using Microsoft.AspNet.PageExecutionInstrumentation;
using Microsoft.Framework.WebEncoders;
using Microsoft.Framework.WebEncoders.Testing;
using Moq;
using Xunit;
@ -31,7 +31,7 @@ namespace Microsoft.AspNet.Mvc.Razor
var page = new TestableRazorPage(v =>
{
actual = v.Output;
v.HtmlEncoder = new HtmlEncoder();
v.HtmlEncoder = new CommonTestEncoder();
v.Write("Hello world");
});
var view = new RazorView(Mock.Of<IRazorViewEngine>(),
@ -48,7 +48,7 @@ namespace Microsoft.AspNet.Mvc.Razor
// Assert
Assert.NotSame(expected, actual);
Assert.IsAssignableFrom<IBufferedTextWriter>(actual);
Assert.Equal("Hello world", viewContext.Writer.ToString());
Assert.Equal("HtmlEncode[[Hello world]]", viewContext.Writer.ToString());
}
[Fact]
@ -167,10 +167,10 @@ namespace Microsoft.AspNet.Mvc.Razor
public async Task RenderAsync_AsPartial_ExecutesLayout_ButNotViewStartPages()
{
// Arrange
var htmlEncoder = new HtmlEncoder();
var expected = string.Join(htmlEncoder.HtmlEncode(Environment.NewLine),
"layout-content",
"page-content");
var htmlEncoder = new CommonTestEncoder();
var expected = string.Join(Environment.NewLine,
"HtmlEncode[[layout-content",
"]]HtmlEncode[[page-content]]");
var page = new TestableRazorPage(v =>
{
v.HtmlEncoder = htmlEncoder;
@ -364,11 +364,11 @@ namespace Microsoft.AspNet.Mvc.Razor
public async Task RenderAsync_ExecutesLayoutPages()
{
// Arrange
var htmlEncoder = new HtmlEncoder();
var htmlEncoder = new CommonTestEncoder();
var htmlEncodedNewLine = htmlEncoder.HtmlEncode(Environment.NewLine);
var expected = "layout-content" +
htmlEncodedNewLine +
"head-content" +
var expected = "HtmlEncode[[layout-content" +
Environment.NewLine +
"]]head-content" +
htmlEncodedNewLine +
"body-content" +
htmlEncodedNewLine +
@ -468,7 +468,7 @@ namespace Microsoft.AspNet.Mvc.Razor
"layout-section-content",
"page-section-content");
var htmlEncoder = new HtmlEncoder();
var htmlEncoder = new CommonTestEncoder();
var page = new TestableRazorPage(v =>
{
v.HtmlEncoder = htmlEncoder;
@ -531,7 +531,7 @@ namespace Microsoft.AspNet.Mvc.Razor
"layout-section-content",
"page-section-content");
var htmlEncoder = new HtmlEncoder();
var htmlEncoder = new CommonTestEncoder();
var page = new TestableRazorPage(v =>
{
v.HtmlEncoder = htmlEncoder;
@ -583,7 +583,7 @@ namespace Microsoft.AspNet.Mvc.Razor
public async Task RenderAsync_WithNestedSections_ThrowsIfSectionsWereDefinedButNotRendered()
{
// Arrange
var htmlEncoder = new HtmlEncoder();
var htmlEncoder = new CommonTestEncoder();
var page = new TestableRazorPage(v =>
{
v.HtmlEncoder = htmlEncoder;
@ -641,7 +641,7 @@ namespace Microsoft.AspNet.Mvc.Razor
public async Task RenderAsync_WithNestedSectionsOfTheSameName_ThrowsIfSectionsWereDefinedButNotRendered()
{
// Arrange
var htmlEncoder = new HtmlEncoder();
var htmlEncoder = new CommonTestEncoder();
var page = new TestableRazorPage(v =>
{
v.HtmlEncoder = htmlEncoder;
@ -735,15 +735,14 @@ namespace Microsoft.AspNet.Mvc.Razor
public async Task RenderAsync_ExecutesNestedLayoutPages()
{
// Arrange
var htmlEncoder = new HtmlEncoder();
var htmlEncodedNewLine = htmlEncoder.HtmlEncode(Environment.NewLine);
var expected = "layout-2" +
htmlEncodedNewLine +
"bar-content" +
var htmlEncoder = new CommonTestEncoder();
var expected = "HtmlEncode[[layout-2" +
Environment.NewLine +
"layout-1" +
htmlEncodedNewLine +
"foo-content" +
"]]bar-content" +
Environment.NewLine +
"HtmlEncode[[layout-1" +
Environment.NewLine +
"]]foo-content" +
Environment.NewLine +
"body-content";
@ -797,15 +796,15 @@ namespace Microsoft.AspNet.Mvc.Razor
public async Task RenderAsync_ExecutesNestedLayoutsWithNestedSections()
{
// Arrange
var htmlEncoder = new HtmlEncoder();
var htmlEncodedNewLine = htmlEncoder.HtmlEncode(Environment.NewLine);
var expected = "BaseLayout" +
htmlEncodedNewLine +
"NestedLayout" +
htmlEncodedNewLine +
"BodyContent" +
var htmlEncoder = new CommonTestEncoder();
var expected = "HtmlEncode[[BaseLayout" +
Environment.NewLine +
"]]HtmlEncode[[NestedLayout" +
Environment.NewLine +
"]]BodyContent" +
"foo-content" +
Environment.NewLine +
"HtmlEncode[[]]" +
Environment.NewLine;
var page = new TestableRazorPage(v =>
@ -860,10 +859,10 @@ namespace Microsoft.AspNet.Mvc.Razor
public async Task RenderAsync_DoesNotCopyContentOnceRazorTextWriterIsNoLongerBuffering()
{
// Arrange
var htmlEncoder = new HtmlEncoder();
var expected = "layout-1" +
htmlEncoder.HtmlEncode(Environment.NewLine) +
"body content" +
var htmlEncoder = new CommonTestEncoder();
var expected = "HtmlEncode[[layout-1" +
Environment.NewLine +
"]]body content" +
Environment.NewLine +
"section-content-1" +
Environment.NewLine +
@ -912,10 +911,10 @@ namespace Microsoft.AspNet.Mvc.Razor
public async Task FlushAsync_DoesNotThrowWhenInvokedInsideOfASection()
{
// Arrange
var htmlEncoder = new HtmlEncoder();
var expected = "layout-1" +
htmlEncoder.HtmlEncode(Environment.NewLine) +
"section-content-1" +
var htmlEncoder = new CommonTestEncoder();
var expected = "HtmlEncode[[layout-1" +
Environment.NewLine +
"]]section-content-1" +
Environment.NewLine +
"section-content-2";
@ -993,7 +992,7 @@ namespace Microsoft.AspNet.Mvc.Razor
var page = new TestableRazorPage(v =>
{
v.Path = "/Views/TestPath/Test.cshtml";
v.HtmlEncoder = new HtmlEncoder();
v.HtmlEncoder = new CommonTestEncoder();
v.DefineSection("foo", async writer =>
{
writer.WriteLine("foo-content");
@ -1004,7 +1003,7 @@ namespace Microsoft.AspNet.Mvc.Razor
});
var layoutPage = new TestableRazorPage(v =>
{
v.HtmlEncoder = new HtmlEncoder();
v.HtmlEncoder = new CommonTestEncoder();
v.Write("layout-1" + Environment.NewLine);
v.Write(v.RenderSection("foo"));
v.DefineSection("bar", writer => writer.WriteLineAsync("bar-content"));
@ -1066,7 +1065,7 @@ namespace Microsoft.AspNet.Mvc.Razor
var page = new TestableRazorPage(v =>
{
v.HtmlEncoder = new HtmlEncoder();
v.HtmlEncoder = new CommonTestEncoder();
v.Layout = "Layout";
Assert.Same(pageWriter, v.Output);
Assert.Same(pageContext, v.PageExecutionContext);
@ -1075,7 +1074,7 @@ namespace Microsoft.AspNet.Mvc.Razor
var layout = new TestableRazorPage(v =>
{
v.HtmlEncoder = new HtmlEncoder();
v.HtmlEncoder = new CommonTestEncoder();
Assert.Same(layoutWriter, v.Output);
Assert.Same(layoutContext, v.PageExecutionContext);
v.RenderBodyPublic();
@ -1127,7 +1126,7 @@ namespace Microsoft.AspNet.Mvc.Razor
var page = new TestableRazorPage(v =>
{
v.HtmlEncoder = new HtmlEncoder();
v.HtmlEncoder = new CommonTestEncoder();
Assert.IsType<RazorTextWriter>(v.Output);
Assert.Same(pageContext, v.PageExecutionContext);
executed = true;
@ -1151,7 +1150,7 @@ namespace Microsoft.AspNet.Mvc.Razor
// Assert
feature.Verify();
Assert.True(executed);
Assert.Equal("Hello world", viewContext.Writer.ToString());
Assert.Equal("HtmlEncode[[Hello world]]", viewContext.Writer.ToString());
}
[Theory]

View File

@ -8,6 +8,7 @@
"Microsoft.AspNet.Mvc.Razor": "6.0.0-*",
"Microsoft.AspNet.Mvc.TestCommon": { "version": "6.0.0-*", "type": "build" },
"Microsoft.AspNet.Testing": "1.0.0-*",
"Microsoft.Framework.WebEncoders.Testing": "1.0.0-*",
"Microsoft.Framework.Runtime": "1.0.0-*",
"xunit.runner.aspnet": "2.0.0-aspnet-*"
},

View File

@ -8,6 +8,7 @@ using Microsoft.AspNet.Mvc.ModelBinding;
using Microsoft.AspNet.Mvc.Rendering;
using Microsoft.AspNet.Razor.Runtime.TagHelpers;
using Microsoft.Framework.WebEncoders;
using Microsoft.Framework.WebEncoders.Testing;
using Moq;
using Xunit;
@ -104,7 +105,7 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
generator
.Setup(mock => mock.GenerateRouteLink(
string.Empty, "Default", "http", "contoso.com", "hello=world", null, null))
.Returns(new TagBuilder("a", new HtmlEncoder()))
.Returns(new TagBuilder("a", new CommonTestEncoder()))
.Verifiable();
var anchorTagHelper = new AnchorTagHelper
{
@ -146,7 +147,7 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
generator
.Setup(mock => mock.GenerateActionLink(
string.Empty, "Index", "Home", "http", "contoso.com", "hello=world", null, null))
.Returns(new TagBuilder("a", new HtmlEncoder()))
.Returns(new TagBuilder("a", new CommonTestEncoder()))
.Verifiable();
var anchorTagHelper = new AnchorTagHelper
{

View File

@ -10,7 +10,7 @@ using Microsoft.AspNet.Mvc.ModelBinding;
using Microsoft.AspNet.Mvc.Rendering;
using Microsoft.AspNet.Razor.Runtime.TagHelpers;
using Microsoft.AspNet.Routing;
using Microsoft.Framework.WebEncoders;
using Microsoft.Framework.WebEncoders.Testing;
using Moq;
using Xunit;
@ -118,10 +118,10 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
It.IsAny<object>(),
It.IsAny<string>(),
It.IsAny<object>()))
.Returns(new TagBuilder("form", new HtmlEncoder()));
.Returns(new TagBuilder("form", new CommonTestEncoder()));
generator.Setup(mock => mock.GenerateAntiForgery(viewContext))
.Returns(new TagBuilder("input", new HtmlEncoder()));
.Returns(new TagBuilder("input", new CommonTestEncoder()));
var formTagHelper = new FormTagHelper
{
Action = "Index",
@ -190,7 +190,7 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
routeValue = Assert.Single(routeValueDictionary, kvp => kvp.Key.Equals("-Foo"));
Assert.Equal("bar", routeValue.Value);
})
.Returns(new TagBuilder("form", new HtmlEncoder()))
.Returns(new TagBuilder("form", new CommonTestEncoder()))
.Verifiable();
var formTagHelper = new FormTagHelper
{
@ -234,7 +234,7 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
var generator = new Mock<IHtmlGenerator>(MockBehavior.Strict);
generator
.Setup(mock => mock.GenerateForm(viewContext, "Index", "Home", null, null, null))
.Returns(new TagBuilder("form", new HtmlEncoder()))
.Returns(new TagBuilder("form", new CommonTestEncoder()))
.Verifiable();
var formTagHelper = new FormTagHelper
{
@ -270,7 +270,7 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
var generator = new Mock<IHtmlGenerator>();
generator.Setup(mock => mock.GenerateAntiForgery(It.IsAny<ViewContext>()))
.Returns(new TagBuilder("input", new HtmlEncoder()));
.Returns(new TagBuilder("input", new CommonTestEncoder()));
var formTagHelper = new FormTagHelper
{
AntiForgery = antiForgery,

View File

@ -10,7 +10,7 @@ using Microsoft.AspNet.Mvc.ModelBinding;
using Microsoft.AspNet.Mvc.Rendering;
using Microsoft.AspNet.Mvc.Rendering.Internal;
using Microsoft.AspNet.Razor.Runtime.TagHelpers;
using Microsoft.Framework.WebEncoders;
using Microsoft.Framework.WebEncoders.Testing;
using Moq;
using Xunit;
@ -156,7 +156,7 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
var originalContent = "original content";
var originalTagName = "not-input";
var expectedPreContent = "original pre-content";
var expectedContent = originalContent + "<input class=\"form-control\" /><hidden />";
var expectedContent = originalContent + "<input class=\"HtmlEncode[[form-control]]\" /><hidden />";
var expectedPostContent = "original post-content";
var context = new TagHelperContext(
@ -183,7 +183,7 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
var htmlGenerator = new Mock<IHtmlGenerator>(MockBehavior.Strict);
var tagHelper = GetTagHelper(htmlGenerator.Object, model: false, propertyName: nameof(Model.IsACar));
var tagBuilder = new TagBuilder("input", new HtmlEncoder())
var tagBuilder = new TagBuilder("input", new CommonTestEncoder())
{
Attributes =
{
@ -204,7 +204,7 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
tagHelper.ViewContext,
tagHelper.For.ModelExplorer,
tagHelper.For.Name))
.Returns(new TagBuilder("hidden", new HtmlEncoder()))
.Returns(new TagBuilder("hidden", new NullTestEncoder()))
.Verifiable();
// Act
@ -288,7 +288,7 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
metadataProvider: metadataProvider);
tagHelper.InputTypeName = inputTypeName;
var tagBuilder = new TagBuilder("input", new HtmlEncoder())
var tagBuilder = new TagBuilder("input", new NullTestEncoder())
{
Attributes =
{
@ -387,7 +387,7 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
metadataProvider: metadataProvider);
tagHelper.InputTypeName = inputTypeName;
var tagBuilder = new TagBuilder("input", new HtmlEncoder())
var tagBuilder = new TagBuilder("input", new NullTestEncoder())
{
Attributes =
{
@ -477,7 +477,7 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
tagHelper.InputTypeName = inputTypeName;
tagHelper.Value = value;
var tagBuilder = new TagBuilder("input", new HtmlEncoder())
var tagBuilder = new TagBuilder("input", new NullTestEncoder())
{
Attributes =
{
@ -588,7 +588,7 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
metadataProvider: metadataProvider);
tagHelper.InputTypeName = inputTypeName;
var tagBuilder = new TagBuilder("input", new HtmlEncoder())
var tagBuilder = new TagBuilder("input", new NullTestEncoder())
{
Attributes =
{
@ -695,7 +695,7 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
propertyName: nameof(Model.Text),
metadataProvider: metadataProvider);
var tagBuilder = new TagBuilder("input", new HtmlEncoder());
var tagBuilder = new TagBuilder("input", new NullTestEncoder());
Dictionary<string, object> htmlAttributes = null;
if (string.Equals(dataTypeName, TemplateRenderer.IEnumerableOfIFormFileName))
@ -774,7 +774,7 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
metadataProvider: metadataProvider);
tagHelper.ViewContext.Html5DateRenderingMode = dateRenderingMode;
var tagBuilder = new TagBuilder("input", new HtmlEncoder());
var tagBuilder = new TagBuilder("input", new NullTestEncoder());
htmlGenerator
.Setup(mock => mock.GenerateTextBox(
tagHelper.ViewContext,

View File

@ -46,18 +46,18 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
{ null, typeof(Model), () => null, "Text",
new TagHelperOutputContent(string.Empty, Environment.NewLine, Environment.NewLine, "Text") },
{ null, typeof(Model), () => null, "Text",
new TagHelperOutputContent(Environment.NewLine, string.Empty, "Text", "Text") },
new TagHelperOutputContent(Environment.NewLine, string.Empty, "HtmlEncode[[Text]]", "Text") },
{ modelWithNull, typeof(Model), () => modelWithNull.Text, "Text",
new TagHelperOutputContent(string.Empty, Environment.NewLine, Environment.NewLine, "Text") },
{ modelWithNull, typeof(Model), () => modelWithNull.Text, "Text",
new TagHelperOutputContent(Environment.NewLine, string.Empty, "Text", "Text") },
new TagHelperOutputContent(Environment.NewLine, string.Empty, "HtmlEncode[[Text]]", "Text") },
{ modelWithNull, typeof(Model), () => modelWithNull.Text, "Text",
new TagHelperOutputContent(Environment.NewLine, "Hello World", "Hello World", "Text") },
{ modelWithText, typeof(Model), () => modelWithText.Text, "Text",
new TagHelperOutputContent(string.Empty, Environment.NewLine, Environment.NewLine, "Text") },
{ modelWithText, typeof(Model), () => modelWithText.Text, "Text",
new TagHelperOutputContent(Environment.NewLine, string.Empty, "Text", "Text") },
new TagHelperOutputContent(Environment.NewLine, string.Empty, "HtmlEncode[[Text]]", "Text") },
{ modelWithText, typeof(Model), () => modelWithText.Text, "Text",
new TagHelperOutputContent(Environment.NewLine, "Hello World", "Hello World", "Text") },
{ modelWithText, typeof(Model), () => modelWithNull.Text, "Text",
@ -74,13 +74,13 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
new TagHelperOutputContent("Hello World1", "Hello World2", "Hello World2", "Text") },
{ modelWithNull, typeof(NestedModel), () => modelWithNull.NestedModel.Text, "NestedModel.Text",
new TagHelperOutputContent(Environment.NewLine, string.Empty, "Text", "NestedModel_Text") },
new TagHelperOutputContent(Environment.NewLine, string.Empty, "HtmlEncode[[Text]]", "NestedModel_Text") },
{ modelWithNull, typeof(NestedModel), () => modelWithNull.NestedModel.Text, "NestedModel.Text",
new TagHelperOutputContent(Environment.NewLine, "Hello World", "Hello World", "NestedModel_Text") },
{ modelWithNull, typeof(NestedModel), () => modelWithNull.NestedModel.Text, "NestedModel.Text",
new TagHelperOutputContent(string.Empty, Environment.NewLine, Environment.NewLine, "NestedModel_Text") },
{ modelWithText, typeof(NestedModel), () => modelWithText.NestedModel.Text, "NestedModel.Text",
new TagHelperOutputContent(Environment.NewLine, string.Empty, "Text", "NestedModel_Text") },
new TagHelperOutputContent(Environment.NewLine, string.Empty, "HtmlEncode[[Text]]", "NestedModel_Text") },
{ modelWithText, typeof(NestedModel), () => modelWithText.NestedModel.Text, "NestedModel.Text",
new TagHelperOutputContent(Environment.NewLine, "Hello World", "Hello World", "NestedModel_Text") },
{ modelWithText, typeof(NestedModel), () => modelWithText.NestedModel.Text, "NestedModel.Text",
@ -101,13 +101,13 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
// Note: Tests cases below here will not work in practice due to current limitations on indexing
// into ModelExpressions. Will be fixed in https://github.com/aspnet/Mvc/issues/1345.
{ models, typeof(Model), () => models[0].Text, "[0].Text",
new TagHelperOutputContent(Environment.NewLine, string.Empty, "Text", "z0__Text") },
new TagHelperOutputContent(Environment.NewLine, string.Empty, "HtmlEncode[[Text]]", "z0__Text") },
{ models, typeof(Model), () => models[0].Text, "[0].Text",
new TagHelperOutputContent(Environment.NewLine, "Hello World", "Hello World", "z0__Text") },
{ models, typeof(Model), () => models[0].Text, "[0].Text",
new TagHelperOutputContent(string.Empty, Environment.NewLine, Environment.NewLine, "z0__Text") },
{ models, typeof(Model), () => models[1].Text, "[1].Text",
new TagHelperOutputContent(Environment.NewLine, string.Empty, "Text", "z1__Text") },
new TagHelperOutputContent(Environment.NewLine, string.Empty, "HtmlEncode[[Text]]", "z1__Text") },
{ models, typeof(Model), () => models[1].Text, "[1].Text",
new TagHelperOutputContent(Environment.NewLine, "Hello World", "Hello World", "z1__Text") },
{ models, typeof(Model), () => models[1].Text, "[1].Text",
@ -126,13 +126,13 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
new TagHelperOutputContent("Hello World1", "Hello World2", "Hello World2", "z1__Text") },
{ models, typeof(NestedModel), () => models[0].NestedModel.Text, "[0].NestedModel.Text",
new TagHelperOutputContent(Environment.NewLine, string.Empty, "Text", "z0__NestedModel_Text") },
new TagHelperOutputContent(Environment.NewLine, string.Empty, "HtmlEncode[[Text]]", "z0__NestedModel_Text") },
{ models, typeof(NestedModel), () => models[0].NestedModel.Text, "[0].NestedModel.Text",
new TagHelperOutputContent(Environment.NewLine, "Hello World", "Hello World", "z0__NestedModel_Text") },
{ models, typeof(NestedModel), () => models[0].NestedModel.Text, "[0].NestedModel.Text",
new TagHelperOutputContent(string.Empty, Environment.NewLine, Environment.NewLine, "z0__NestedModel_Text") },
{ models, typeof(NestedModel), () => models[1].NestedModel.Text, "[1].NestedModel.Text",
new TagHelperOutputContent(Environment.NewLine, string.Empty, "Text", "z1__NestedModel_Text") },
new TagHelperOutputContent(Environment.NewLine, string.Empty, "HtmlEncode[[Text]]", "z1__NestedModel_Text") },
{ models, typeof(NestedModel), () => models[1].NestedModel.Text, "[1].NestedModel.Text",
new TagHelperOutputContent(Environment.NewLine, "Hello World", "Hello World", "z1__NestedModel_Text") },
{ models, typeof(NestedModel), () => models[1].NestedModel.Text, "[1].NestedModel.Text",

View File

@ -20,6 +20,7 @@ using Microsoft.Framework.Expiration.Interfaces;
using Microsoft.Framework.Logging;
using Microsoft.Framework.Runtime;
using Microsoft.Framework.WebEncoders;
using Microsoft.Framework.WebEncoders.Testing;
using Moq;
using Xunit;
@ -178,8 +179,8 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
var viewContext = MakeViewContext();
var helper = new LinkTagHelper
{
HtmlEncoder = new HtmlEncoder(),
JavaScriptEncoder = new JavaScriptStringEncoder(),
HtmlEncoder = new CommonTestEncoder(),
JavaScriptEncoder = new CommonTestEncoder(),
Logger = logger.Object,
HostingEnvironment = hostingEnvironment,
ViewContext = viewContext,
@ -222,8 +223,8 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
var viewContext = MakeViewContext();
var helper = new LinkTagHelper
{
HtmlEncoder = new HtmlEncoder(),
JavaScriptEncoder = new JavaScriptStringEncoder(),
HtmlEncoder = new CommonTestEncoder(),
JavaScriptEncoder = new CommonTestEncoder(),
Logger = logger.Object,
HostingEnvironment = hostingEnvironment,
ViewContext = viewContext,
@ -240,7 +241,7 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
// Assert
Assert.StartsWith(
"<link rel=\"stylesheet\" data-extra=\"something\" href=\"test.css\"", output.Content.GetContent());
"<link rel=\"stylesheet\" data-extra=\"something\" href=\"HtmlEncode[[test.css]]\"", output.Content.GetContent());
}
public static TheoryData DoesNotRunWhenARequiredAttributeIsMissing_Data
@ -392,7 +393,7 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
.Returns(new[] { "/css/site.css", "/base.css" });
var helper = new LinkTagHelper
{
HtmlEncoder = new HtmlEncoder(),
HtmlEncoder = new CommonTestEncoder(),
GlobbingUrlBuilder = globbingUrlBuilder.Object,
Logger = logger.Object,
HostingEnvironment = hostingEnvironment,
@ -407,8 +408,8 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
// Assert
Assert.Equal(
"<link rel=\"stylesheet\" href=\"/css/site.css\" />" +
"<link rel=\"stylesheet\" href=\"/base.css\" />",
"<link rel=\"stylesheet\" href=\"HtmlEncode[[/css/site.css]]\" />" +
"<link rel=\"stylesheet\" href=\"HtmlEncode[[/base.css]]\" />",
output.Content.GetContent());
}
@ -435,7 +436,7 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
.Returns(new[] { "/css/site.css", "/base.css" });
var helper = new LinkTagHelper
{
HtmlEncoder = new TestHtmlEncoder(),
HtmlEncoder = new CommonTestEncoder(),
GlobbingUrlBuilder = globbingUrlBuilder.Object,
Logger = logger.Object,
HostingEnvironment = hostingEnvironment,
@ -475,7 +476,7 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
var viewContext = MakeViewContext();
var helper = new LinkTagHelper
{
HtmlEncoder = new TestHtmlEncoder(),
HtmlEncoder = new CommonTestEncoder(),
Logger = logger.Object,
HostingEnvironment = hostingEnvironment,
ViewContext = viewContext,
@ -514,7 +515,7 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
var viewContext = MakeViewContext("/bar");
var helper = new LinkTagHelper
{
HtmlEncoder = new TestHtmlEncoder(),
HtmlEncoder = new CommonTestEncoder(),
Logger = logger.Object,
HostingEnvironment = hostingEnvironment,
ViewContext = viewContext,
@ -557,7 +558,7 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
.Returns(new[] { "/css/site.css", "/base.css" });
var helper = new LinkTagHelper
{
HtmlEncoder = new TestHtmlEncoder(),
HtmlEncoder = new CommonTestEncoder(),
GlobbingUrlBuilder = globbingUrlBuilder.Object,
Logger = logger.Object,
HostingEnvironment = hostingEnvironment,

View File

@ -233,14 +233,14 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
"text")
},
{
"text", null, null, new [] { "text", },
"HtmlEncode[[text]]", null, null, new [] { "text", },
GetTagHelperOutput(
"not-option",
new Dictionary<string, object>
{
{ "label", "my-label" }, { "selected", "selected" }
},
"text")
"HtmlEncode[[text]]")
},
{
"text", string.Empty, null, new [] { "text", },
@ -253,14 +253,14 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
"text")
},
{
"text", null, null, new [] { string.Empty, "text", },
"HtmlEncode[[text]]", null, null, new [] { string.Empty, "text", },
GetTagHelperOutput(
"not-option",
new Dictionary<string, object>
{
{ "label", "my-label" }, { "selected", "selected" }
},
"text")
"HtmlEncode[[text]]")
},
{
"text", string.Empty, "value", null,
@ -400,15 +400,16 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
uniqueId: "test",
getChildContentAsync: () =>
{
var tagHelperContent = new DefaultTagHelperContent();
tagHelperContent.SetContent(originalContent);
return Task.FromResult<TagHelperContent>(tagHelperContent);
// GetChildContentAsync should not be invoked since we are setting the content below.
Assert.True(false);
return Task.FromResult<TagHelperContent>(null);
});
var output = new TagHelperOutput(expectedTagHelperOutput.TagName, originalAttributes)
{
SelfClosing = false,
};
output.Content.SetContent(originalContent);
var metadataProvider = new EmptyModelMetadataProvider();

View File

@ -20,6 +20,7 @@ using Microsoft.Framework.Expiration.Interfaces;
using Microsoft.Framework.Logging;
using Microsoft.Framework.Runtime;
using Microsoft.Framework.WebEncoders;
using Microsoft.Framework.WebEncoders.Testing;
using Moq;
using Xunit;
@ -222,8 +223,8 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
var viewContext = MakeViewContext();
var helper = new ScriptTagHelper
{
HtmlEncoder = new HtmlEncoder(),
JavaScriptEncoder = new JavaScriptStringEncoder(),
HtmlEncoder = new CommonTestEncoder(),
JavaScriptEncoder = new CommonTestEncoder(),
Logger = logger,
HostingEnvironment = hostingEnvironment,
ViewContext = viewContext,
@ -453,8 +454,8 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
var helper = new ScriptTagHelper
{
HtmlEncoder = new HtmlEncoder(),
JavaScriptEncoder = new JavaScriptStringEncoder(),
HtmlEncoder = new CommonTestEncoder(),
JavaScriptEncoder = new CommonTestEncoder(),
Logger = logger,
ViewContext = viewContext,
HostingEnvironment = hostingEnvironment,
@ -469,7 +470,8 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
// Assert
Assert.StartsWith(
"<script data-extra=\"something\" data-more=\"else\" src=\"/blank.js\"", output.Content.GetContent());
"<script data-extra=\"HtmlEncode[[something]]\" data-more=\"HtmlEncode[[else]]\" src=\"HtmlEncode[[/blank.js]]\"",
output.Content.GetContent());
Assert.Empty(logger.Logged);
}
@ -498,7 +500,7 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
ViewContext = viewContext,
Src = "/js/site.js",
SrcInclude = "**/*.js",
HtmlEncoder = new HtmlEncoder(),
HtmlEncoder = new CommonTestEncoder(),
Cache = MakeCache(),
};
@ -506,7 +508,8 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
await helper.ProcessAsync(context, output);
// Assert
Assert.Equal("<script src=\"/js/site.js\"></script><script src=\"/common.js\"></script>", output.Content.GetContent());
Assert.Equal("<script src=\"HtmlEncode[[/js/site.js]]\"></script>" +
"<script src=\"HtmlEncode[[/common.js]]\"></script>", output.Content.GetContent());
}
[Fact]
@ -534,7 +537,7 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
ViewContext = viewContext,
Src = "/js/site.js",
SrcInclude = "**/*.js",
HtmlEncoder = new TestHtmlEncoder(),
HtmlEncoder = new CommonTestEncoder(),
JavaScriptEncoder = new TestJavaScriptEncoder(),
Cache = MakeCache(),
};
@ -569,7 +572,7 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
HostingEnvironment = hostingEnvironment,
ViewContext = viewContext,
FileVersion = true,
HtmlEncoder = new TestHtmlEncoder(),
HtmlEncoder = new CommonTestEncoder(),
JavaScriptEncoder = new TestJavaScriptEncoder(),
Src = "/js/site.js",
Cache = MakeCache(),
@ -606,7 +609,7 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
HostingEnvironment = hostingEnvironment,
ViewContext = viewContext,
FileVersion = true,
HtmlEncoder = new TestHtmlEncoder(),
HtmlEncoder = new CommonTestEncoder(),
JavaScriptEncoder = new TestJavaScriptEncoder(),
Src = "/bar/js/site.js",
Cache = MakeCache(),
@ -647,7 +650,7 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
FallbackSrc = "fallback.js",
FallbackTestExpression = "isavailable()",
FileVersion = true,
HtmlEncoder = new TestHtmlEncoder(),
HtmlEncoder = new CommonTestEncoder(),
JavaScriptEncoder = new TestJavaScriptEncoder(),
Src = "/js/site.js",
Cache = MakeCache(),
@ -690,7 +693,7 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
ViewContext = viewContext,
SrcInclude = "*.js",
FileVersion = true,
HtmlEncoder = new TestHtmlEncoder(),
HtmlEncoder = new CommonTestEncoder(),
JavaScriptEncoder = new TestJavaScriptEncoder(),
Src = "/js/site.js",
Cache = MakeCache(),

View File

@ -44,17 +44,17 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
modelWithText,
};
var noneSelected = "<option></option>" + Environment.NewLine +
"<option>outer text</option>" + Environment.NewLine +
"<option>inner text</option>" + Environment.NewLine +
"<option>other text</option>" + Environment.NewLine;
"<option>HtmlEncode[[outer text]]</option>" + Environment.NewLine +
"<option>HtmlEncode[[inner text]]</option>" + Environment.NewLine +
"<option>HtmlEncode[[other text]]</option>" + Environment.NewLine;
var innerSelected = "<option></option>" + Environment.NewLine +
"<option>outer text</option>" + Environment.NewLine +
"<option selected=\"selected\">inner text</option>" + Environment.NewLine +
"<option>other text</option>" + Environment.NewLine;
"<option>HtmlEncode[[outer text]]</option>" + Environment.NewLine +
"<option selected=\"HtmlEncode[[selected]]\">HtmlEncode[[inner text]]</option>" + Environment.NewLine +
"<option>HtmlEncode[[other text]]</option>" + Environment.NewLine;
var outerSelected = "<option></option>" + Environment.NewLine +
"<option selected=\"selected\">outer text</option>" + Environment.NewLine +
"<option>inner text</option>" + Environment.NewLine +
"<option>other text</option>" + Environment.NewLine;
"<option selected=\"HtmlEncode[[selected]]\">HtmlEncode[[outer text]]</option>" + Environment.NewLine +
"<option>HtmlEncode[[inner text]]</option>" + Environment.NewLine +
"<option>HtmlEncode[[other text]]</option>" + Environment.NewLine;
return new TheoryData<object, Type, Func<object>, NameAndId, string>
{

View File

@ -7,7 +7,7 @@ using System.Threading.Tasks;
using Microsoft.AspNet.Mvc.Rendering;
using Microsoft.AspNet.Razor.Runtime.TagHelpers;
using Microsoft.AspNet.Testing;
using Microsoft.Framework.WebEncoders;
using Microsoft.Framework.WebEncoders.Testing;
using Xunit;
namespace Microsoft.AspNet.Mvc.TagHelpers
@ -165,7 +165,7 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
var expectedAttribute = new KeyValuePair<string, object>("type", "btn");
tagHelperOutput.Attributes.Add(expectedAttribute);
var tagBuilder = new TagBuilder("p", new HtmlEncoder());
var tagBuilder = new TagBuilder("p", new CommonTestEncoder());
tagBuilder.Attributes.Add("type", "hello");
// Act
@ -185,7 +185,7 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
attributes: new Dictionary<string, object>());
tagHelperOutput.Attributes.Add("class", "Hello");
var tagBuilder = new TagBuilder("p", new HtmlEncoder());
var tagBuilder = new TagBuilder("p", new CommonTestEncoder());
tagBuilder.Attributes.Add("class", "btn");
var expectedAttribute = new KeyValuePair<string, object>("class", "Hello btn");
@ -211,7 +211,7 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
attributes: new Dictionary<string, object>());
tagHelperOutput.Attributes.Add(originalName, "Hello");
var tagBuilder = new TagBuilder("p", new HtmlEncoder());
var tagBuilder = new TagBuilder("p", new CommonTestEncoder());
tagBuilder.Attributes.Add(updateName, "btn");
// Act
@ -230,7 +230,7 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
"p",
attributes: new Dictionary<string, object>());
var tagBuilder = new TagBuilder("p", new HtmlEncoder());
var tagBuilder = new TagBuilder("p", new CommonTestEncoder());
var expectedAttribute = new KeyValuePair<string, object>("visible", "val < 3");
tagBuilder.Attributes.Add("visible", "val < 3");
@ -250,7 +250,7 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
"p",
attributes: new Dictionary<string, object>());
var tagBuilder = new TagBuilder("p", new HtmlEncoder());
var tagBuilder = new TagBuilder("p", new CommonTestEncoder());
var expectedAttribute1 = new KeyValuePair<string, object>("class", "btn");
var expectedAttribute2 = new KeyValuePair<string, object>("class2", "btn");
tagBuilder.Attributes.Add("class", "btn");
@ -277,7 +277,7 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
var expectedAttribute = new KeyValuePair<string, object>("class", "btn");
tagHelperOutput.Attributes.Add(expectedAttribute);
var tagBuilder = new TagBuilder("p", new HtmlEncoder());
var tagBuilder = new TagBuilder("p", new CommonTestEncoder());
// Act
tagHelperOutput.MergeAttributes(tagBuilder);
@ -297,7 +297,7 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
var expectedOutputAttribute = new KeyValuePair<string, object>("class", "btn");
tagHelperOutput.Attributes.Add(expectedOutputAttribute);
var tagBuilder = new TagBuilder("p", new HtmlEncoder());
var tagBuilder = new TagBuilder("p", new CommonTestEncoder());
var expectedBuilderAttribute = new KeyValuePair<string, object>("for", "hello");
tagBuilder.Attributes.Add("for", "hello");

View File

@ -11,7 +11,7 @@ using Microsoft.AspNet.Mvc.Rendering;
using Microsoft.AspNet.Routing;
using Microsoft.Framework.DependencyInjection;
using Microsoft.Framework.OptionsModel;
using Microsoft.Framework.WebEncoders;
using Microsoft.Framework.WebEncoders.Testing;
using Moq;
namespace Microsoft.AspNet.Mvc.TagHelpers
@ -39,7 +39,7 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
IOptions<MvcOptions> options,
IUrlHelper urlHelper,
IDictionary<string, object> validationAttributes)
: base(GetAntiForgery(), options, metadataProvider, urlHelper, new HtmlEncoder())
: base(GetAntiForgery(), options, metadataProvider, urlHelper, new CommonTestEncoder())
{
_validationAttributes = validationAttributes;
}
@ -71,7 +71,7 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
public override TagBuilder GenerateAntiForgery(ViewContext viewContext)
{
return new TagBuilder("input", new HtmlEncoder())
return new TagBuilder("input", new CommonTestEncoder())
{
Attributes =
{
@ -116,7 +116,7 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
Mock.Of<IDataProtectionProvider>(),
Mock.Of<IAntiForgeryAdditionalDataProvider>(),
optionsAccessor.Object,
new HtmlEncoder(),
new CommonTestEncoder(),
mockDataProtectionOptions.Object);
return antiForgery;

View File

@ -45,35 +45,35 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
{
{ null, typeof(Model), null,
new NameAndId("Text", "Text"),
Environment.NewLine },
Environment.NewLine + "HtmlEncode[[]]" },
{ modelWithNull, typeof(Model), modelWithNull.Text,
new NameAndId("Text", "Text"),
Environment.NewLine },
Environment.NewLine + "HtmlEncode[[]]" },
{ modelWithText, typeof(Model), modelWithText.Text,
new NameAndId("Text", "Text"),
Environment.NewLine + "outer text" },
Environment.NewLine + "HtmlEncode[[outer text]]" },
{ modelWithNull, typeof(NestedModel), modelWithNull.NestedModel.Text,
new NameAndId("NestedModel.Text", "NestedModel_Text"),
Environment.NewLine },
Environment.NewLine + "HtmlEncode[[]]" },
{ modelWithText, typeof(NestedModel), modelWithText.NestedModel.Text,
new NameAndId("NestedModel.Text", "NestedModel_Text"),
Environment.NewLine + "inner text" },
Environment.NewLine + "HtmlEncode[[inner text]]" },
{ models, typeof(Model), models[0].Text,
new NameAndId("[0].Text", "z0__Text"),
Environment.NewLine },
Environment.NewLine + "HtmlEncode[[]]" },
{ models, typeof(Model), models[1].Text,
new NameAndId("[1].Text", "z1__Text"),
Environment.NewLine + "outer text" },
Environment.NewLine + "HtmlEncode[[outer text]]" },
{ models, typeof(NestedModel), models[0].NestedModel.Text,
new NameAndId("[0].NestedModel.Text", "z0__NestedModel_Text"),
Environment.NewLine },
Environment.NewLine + "HtmlEncode[[]]" },
{ models, typeof(NestedModel), models[1].NestedModel.Text,
new NameAndId("[1].NestedModel.Text", "z1__NestedModel_Text"),
Environment.NewLine + "inner text" },
Environment.NewLine + "HtmlEncode[[inner text]]" },
};
}
}

View File

@ -9,7 +9,7 @@ using Microsoft.AspNet.Mvc.ModelBinding;
using Microsoft.AspNet.Mvc.Rendering;
using Microsoft.AspNet.Razor.Runtime.TagHelpers;
using Microsoft.AspNet.Routing;
using Microsoft.Framework.WebEncoders;
using Microsoft.Framework.WebEncoders.Testing;
using Moq;
using Xunit;
@ -115,7 +115,7 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
generator
.Setup(mock =>
mock.GenerateValidationMessage(expectedViewContext, "Hello", null, null, null))
.Returns(new TagBuilder("span", new HtmlEncoder()))
.Returns(new TagBuilder("span", new CommonTestEncoder()))
.Verifiable();
validationMessageTagHelper.Generator = generator.Object;
validationMessageTagHelper.ViewContext = expectedViewContext;
@ -158,7 +158,7 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
tagHelperContent.SetContent(childContent);
return Task.FromResult<TagHelperContent>(tagHelperContent);
});
var tagBuilder = new TagBuilder("span2", new HtmlEncoder())
var tagBuilder = new TagBuilder("span2", new CommonTestEncoder())
{
InnerHtml = "New HTML"
};
@ -216,7 +216,7 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
tagHelperContent.SetContent(childContent);
return Task.FromResult<TagHelperContent>(tagHelperContent);
});
var tagBuilder = new TagBuilder("span2", new HtmlEncoder())
var tagBuilder = new TagBuilder("span2", new CommonTestEncoder())
{
InnerHtml = "New HTML"
};

View File

@ -4,6 +4,7 @@
"Microsoft.AspNet.Mvc.TestCommon": { "version": "6.0.0-*", "type": "build" },
"Microsoft.AspNet.Testing": "1.0.0-*",
"Microsoft.Framework.Logging.Interfaces": "1.0.0-*",
"Microsoft.Framework.WebEncoders.Testing": "1.0.0-*",
"xunit.runner.aspnet": "2.0.0-aspnet-*"
},
"commands": {