protected virtual TagHelperOutput GetSelectTag(TagHelperContext context, TagHelperOutput output) { var selectTagHelper = new SelectTagHelper(_generator) { For = TagHelper.AspFor, Items = GetSelectItems(context, output), ViewContext = TagHelper.ViewContext }; var selectTagHelperOutput = GetInnerTagHelper(GetInputAttributes(context, output), context, selectTagHelper, "select", TagMode.StartTagAndEndTag); selectTagHelperOutput.Attributes.AddClass("form-control"); selectTagHelperOutput.Attributes.AddClass(GetSize(context, output)); AddDisabledAttribute(selectTagHelperOutput); AddInfoTextId(selectTagHelperOutput); return(selectTagHelperOutput); }
protected virtual async Task <TagHelperOutput> GetSelectTagAsync(TagHelperContext context, TagHelperOutput output) { var selectTagHelper = new SelectTagHelper(_generator) { For = TagHelper.AspFor, Items = GetSelectItems(context, output), ViewContext = TagHelper.ViewContext }; var selectTagHelperOutput = await selectTagHelper.ProcessAndGetOutputAsync(GetInputAttributes(context, output), context, "select", TagMode.StartTagAndEndTag).ConfigureAwait(false); selectTagHelperOutput.Attributes.AddClass("form-control"); selectTagHelperOutput.Attributes.AddClass(GetSize(context, output)); AddDisabledAttribute(selectTagHelperOutput); AddInfoTextId(selectTagHelperOutput); return(selectTagHelperOutput); }
private async Task <TagHelperOutput> CreateSelect(TagHelperContext context) { SelectItems ??= new List <SelectListItem>(); var tagHelper = new SelectTagHelper(Generator); tagHelper.ViewContext = ViewContext; tagHelper.For = For; tagHelper.Items = SelectItems; TagHelperOutput tagHelperOutput = TagHelperExtension.CreateTagHelperOutput("select"); if (Multiple) { tagHelperOutput.Attributes.Add("multiple", "multiple"); } tagHelperOutput.SetAttribute("class", "form-control"); await tagHelper.ProcessAsync(context, tagHelperOutput); return(tagHelperOutput); }
public async Task ProcessAsync_HasErrorClassWhenErrorSpecified() { // Arrange var context = new TagHelperContext( tagName: "govuk-select", allAttributes: new TagHelperAttributeList(), items: new Dictionary <object, object>(), uniqueId: "test"); var output = new TagHelperOutput( "govuk-select", attributes: new TagHelperAttributeList(), getChildContentAsync: (useCachedResult, encoder) => { var formGroupContext = (FormGroupBuilder)context.Items[typeof(FormGroupBuilder)]; formGroupContext.TrySetLabel( isPageHeading: false, attributes: null, content: new HtmlString("The label")); formGroupContext.TrySetErrorMessage( visuallyHiddenText: null, attributes: null, content: new HtmlString("Error")); var tagHelperContent = new DefaultTagHelperContent(); return(Task.FromResult <TagHelperContent>(tagHelperContent)); }); var tagHelper = new SelectTagHelper(new DefaultGovUkHtmlGenerator(), new DefaultModelHelper()) { Id = "my-id", DescribedBy = "describedby", Name = "my-id" }; // Act await tagHelper.ProcessAsync(context, output); // Assert var html = output.AsString(); var node = HtmlNode.CreateNode(html); Assert.Contains("govuk-select--error", node.ChildNodes.FindFirst("select").GetCssClasses()); }
public void Process_WithEmptyForName_DoesNotThrow_WithName() { // Arrange var expectedAttributeValue = "-expression-"; var expectedTagName = "select"; var metadataProvider = new EmptyModelMetadataProvider(); var htmlGenerator = new TestableHtmlGenerator(metadataProvider); var model = "model-value"; var modelExplorer = metadataProvider.GetModelExplorerForType(typeof(string), model); var modelExpression = new ModelExpression(name: string.Empty, modelExplorer: modelExplorer); var viewContext = TestableHtmlGenerator.GetViewContext(model, htmlGenerator, metadataProvider); var tagHelper = new SelectTagHelper(htmlGenerator) { For = modelExpression, Name = expectedAttributeValue, ViewContext = viewContext, }; var attributes = new TagHelperAttributeList { { "name", expectedAttributeValue }, }; var context = new TagHelperContext(attributes, new Dictionary <object, object>(), "test"); var output = new TagHelperOutput( expectedTagName, new TagHelperAttributeList(), (_, __) => Task.FromResult <TagHelperContent>(new DefaultTagHelperContent())); // Act tagHelper.Process(context, output); // Assert Assert.Equal(expectedTagName, output.TagName); Assert.False(output.IsContentModified); var attribute = Assert.Single(output.Attributes); Assert.Equal("name", attribute.Name); Assert.Equal(expectedAttributeValue, attribute.Value); }
protected virtual async Task <TagHelperOutput> GetSelectTagAsync(TagHelperContext context, TagHelperOutput output) { var selectTagHelper = new SelectTagHelper(_generator) { For = TagHelper.AspFor, ViewContext = TagHelper.ViewContext }; if (TagHelper.AutocompleteApiUrl.IsNullOrEmpty()) { selectTagHelper.Items = GetSelectItems(context, output); } var selectTagHelperOutput = await selectTagHelper.ProcessAndGetOutputAsync(GetInputAttributes(context, output), context, "select", TagMode.StartTagAndEndTag); selectTagHelperOutput.Attributes.AddClass("form-control"); selectTagHelperOutput.Attributes.AddClass(GetSize(context, output)); AddDisabledAttribute(selectTagHelperOutput); AddInfoTextId(selectTagHelperOutput); AddAutocompleteAttributes(selectTagHelperOutput); return(selectTagHelperOutput); }
public TagHelperOutput GenerateSelectTagHelper(ModelExpression f, IEnumerable <SelectListItem> items, string optionName, string optionValue) { var itemsList = new List <SelectListItem>(); if (!string.IsNullOrWhiteSpace(optionName)) { itemsList.Add(new SelectListItem(optionName, optionValue)); } if (items != null) { itemsList.AddRange(items); } var tagHelper = new SelectTagHelper(generator) { For = f, Name = f.Name, Items = itemsList, ViewContext = viewContext }; return(GenerateTagHelperCore(f, tagHelper, "select", TagMode.StartTagAndEndTag)); }
public async Task ProcessAsync_GeneratesExpectedOutput() { // Arrange var context = new TagHelperContext( tagName: "govuk-select", allAttributes: new TagHelperAttributeList(), items: new Dictionary <object, object>(), uniqueId: "test"); var output = new TagHelperOutput( "govuk-select", attributes: new TagHelperAttributeList(), getChildContentAsync: (useCachedResult, encoder) => { var formGroupContext = (FormGroupBuilder)context.Items[typeof(FormGroupBuilder)]; formGroupContext.TrySetLabel( isPageHeading: false, attributes: null, content: new HtmlString("The label")); var selectContext = (SelectContext)context.Items[typeof(SelectContext)]; selectContext.AddItem(new SelectListItem() { Content = new HtmlString("First") }); selectContext.AddItem(new SelectListItem() { Content = new HtmlString("Second"), Value = "second" }); selectContext.AddItem(new SelectListItem() { Content = new HtmlString("Third"), IsDisabled = true, Value = "third" }); selectContext.AddItem(new SelectListItem() { Content = new HtmlString("Fourth"), IsSelected = true, Value = "fourth" }); var tagHelperContent = new DefaultTagHelperContent(); return(Task.FromResult <TagHelperContent>(tagHelperContent)); }); var tagHelper = new SelectTagHelper(new DefaultGovUkHtmlGenerator(), new DefaultModelHelper()) { Id = "my-id", DescribedBy = "describedby", Name = "my-id" }; // Act await tagHelper.ProcessAsync(context, output); // Assert var html = output.AsString(); var node = HtmlNode.CreateNode(html); var input = node.ChildNodes.FindFirst("select"); Assert.Equal( "<select aria-describedby=\"describedby\" class=\"govuk-select\" id=\"my-id\" name=\"my-id\">" + "<option>First</option>" + "<option value=\"second\">Second</option>" + "<option disabled=\"disabled\" value=\"third\">Third</option>" + "<option selected=\"selected\" value=\"fourth\">Fourth</option>" + "</select>", input.OuterHtml); }
public async Task TagHelper_CallsGeneratorWithExpectedValues_RealModelType( Type modelType, object model, bool allowMultiple) { // Arrange var contextAttributes = new TagHelperAttributeList( Enumerable.Empty <TagHelperAttribute>()); var originalAttributes = new TagHelperAttributeList(); var propertyName = "Property1"; var tagName = "select"; var tagHelperContext = new TagHelperContext( tagName: "select", allAttributes: contextAttributes, items: new Dictionary <object, object>(), uniqueId: "test"); var output = new TagHelperOutput( tagName, originalAttributes, getChildContentAsync: (useCachedResult, encoder) => { var tagHelperContent = new DefaultTagHelperContent(); tagHelperContent.SetContent("Something"); return(Task.FromResult <TagHelperContent>(tagHelperContent)); }); var metadataProvider = new EmptyModelMetadataProvider(); var modelExplorer = metadataProvider.GetModelExplorerForType(modelType, model); var modelExpression = new ModelExpression(propertyName, modelExplorer); var htmlGenerator = new Mock <IHtmlGenerator>(MockBehavior.Strict); var viewContext = TestableHtmlGenerator.GetViewContext(model, htmlGenerator.Object, metadataProvider); var currentValues = new string[0]; htmlGenerator .Setup(real => real.GetCurrentValues( viewContext, modelExplorer, propertyName, // expression allowMultiple)) .Returns(currentValues) .Verifiable(); htmlGenerator .Setup(real => real.GenerateSelect( viewContext, modelExplorer, null, // optionLabel propertyName, // expression It.IsAny <IEnumerable <SelectListItem> >(), currentValues, allowMultiple, null)) // htmlAttributes .Returns((TagBuilder)null) .Verifiable(); var tagHelper = new SelectTagHelper(htmlGenerator.Object) { For = modelExpression, ViewContext = viewContext, }; // Act tagHelper.Init(tagHelperContext); await tagHelper.ProcessAsync(tagHelperContext, output); // Assert htmlGenerator.Verify(); var keyValuePair = Assert.Single( tagHelperContext.Items, entry => (Type)entry.Key == typeof(SelectTagHelper)); var actualCurrentValues = Assert.IsType <CurrentValues>(keyValuePair.Value); Assert.Same(currentValues, actualCurrentValues.Values); }
public async Task ProcessAsync_CallsGeneratorWithExpectedValues_ItemsAndAttribute( IEnumerable <SelectListItem> inputItems, string attributeName, string attributeValue, IEnumerable <SelectListItem> expectedItems) { // Arrange var contextAttributes = new TagHelperAttributeList { // Provided for completeness. Select tag helper does not confirm AllAttributes set is consistent. { attributeName, attributeValue }, }; var originalAttributes = new TagHelperAttributeList { { attributeName, attributeValue }, }; var propertyName = "Property1"; var expectedTagName = "select"; var tagHelperContext = new TagHelperContext( tagName: "select", allAttributes: contextAttributes, items: new Dictionary <object, object>(), uniqueId: "test"); var output = new TagHelperOutput( expectedTagName, originalAttributes, getChildContentAsync: (useCachedResult, encoder) => { var tagHelperContent = new DefaultTagHelperContent(); tagHelperContent.SetContent("Something"); return(Task.FromResult <TagHelperContent>(tagHelperContent)); }); var metadataProvider = new EmptyModelMetadataProvider(); string model = null; var modelExplorer = metadataProvider.GetModelExplorerForType(typeof(string), model); var htmlGenerator = new Mock <IHtmlGenerator>(MockBehavior.Strict); var viewContext = TestableHtmlGenerator.GetViewContext(model, htmlGenerator.Object, metadataProvider); // Simulate a (model => model) scenario. E.g. the calling helper may appear in a low-level template. var modelExpression = new ModelExpression(string.Empty, modelExplorer); viewContext.ViewData.TemplateInfo.HtmlFieldPrefix = propertyName; var currentValues = new string[0]; htmlGenerator .Setup(real => real.GetCurrentValues( viewContext, modelExplorer, string.Empty, // expression false)) // allowMultiple .Returns(currentValues) .Verifiable(); htmlGenerator .Setup(real => real.GenerateSelect( viewContext, modelExplorer, null, // optionLabel string.Empty, // expression expectedItems, currentValues, false, // allowMultiple null)) // htmlAttributes .Returns((TagBuilder)null) .Verifiable(); var tagHelper = new SelectTagHelper(htmlGenerator.Object) { For = modelExpression, Items = inputItems, ViewContext = viewContext, }; // Act tagHelper.Init(tagHelperContext); await tagHelper.ProcessAsync(tagHelperContext, output); // Assert htmlGenerator.Verify(); var keyValuePair = Assert.Single( tagHelperContext.Items, entry => (Type)entry.Key == typeof(SelectTagHelper)); var actualCurrentValues = Assert.IsType <CurrentValues>(keyValuePair.Value); Assert.Same(currentValues, actualCurrentValues.Values); }
public async Task ProcessAsyncInTemplate_WithItems_GeneratesExpectedOutput_DoesNotChangeSelectList( object model, Type containerType, Func <object> modelAccessor, NameAndId nameAndId, string expectedOptions) { // Arrange var originalAttributes = new TagHelperAttributeList { { "class", "form-control" }, }; var originalPostContent = "original content"; var expectedAttributes = new TagHelperAttributeList(originalAttributes) { { "id", nameAndId.Id }, { "name", nameAndId.Name }, { "valid", "from validation attributes" }, }; var expectedPreContent = "original pre-content"; var expectedContent = "original content"; var expectedPostContent = originalPostContent + expectedOptions; var expectedTagName = "select"; var metadataProvider = new TestModelMetadataProvider(); var containerMetadata = metadataProvider.GetMetadataForType(containerType); var containerExplorer = metadataProvider.GetModelExplorerForType(containerType, model); var propertyMetadata = metadataProvider.GetMetadataForProperty(containerType, "Text"); var modelExplorer = containerExplorer.GetExplorerForExpression(propertyMetadata, modelAccessor()); var modelExpression = new ModelExpression(name: string.Empty, modelExplorer: modelExplorer); var tagHelperContext = new TagHelperContext( tagName: "select", allAttributes: new TagHelperAttributeList( Enumerable.Empty <TagHelperAttribute>()), items: new Dictionary <object, object>(), uniqueId: "test"); var output = new TagHelperOutput( expectedTagName, originalAttributes, getChildContentAsync: (useCachedResult, encoder) => { var tagHelperContent = new DefaultTagHelperContent(); tagHelperContent.AppendHtml("Something"); return(Task.FromResult <TagHelperContent>(tagHelperContent)); }) { TagMode = TagMode.SelfClosing, }; output.PreContent.AppendHtml(expectedPreContent); output.Content.AppendHtml(expectedContent); output.PostContent.AppendHtml(originalPostContent); var htmlGenerator = new TestableHtmlGenerator(metadataProvider) { ValidationAttributes = { { "valid", "from validation attributes" }, } }; var viewContext = TestableHtmlGenerator.GetViewContext(model, htmlGenerator, metadataProvider); viewContext.ViewData.TemplateInfo.HtmlFieldPrefix = nameAndId.Name; var items = new SelectList(new[] { "", "outer text", "inner text", "other text" }); var savedDisabled = items.Select(item => item.Disabled).ToList(); var savedGroup = items.Select(item => item.Group).ToList(); var savedSelected = items.Select(item => item.Selected).ToList(); var savedText = items.Select(item => item.Text).ToList(); var savedValue = items.Select(item => item.Value).ToList(); var tagHelper = new SelectTagHelper(htmlGenerator) { For = modelExpression, Items = items, ViewContext = viewContext, }; // Act tagHelper.Init(tagHelperContext); await tagHelper.ProcessAsync(tagHelperContext, output); // Assert Assert.Equal(TagMode.SelfClosing, output.TagMode); Assert.Equal(expectedAttributes, output.Attributes); Assert.Equal(expectedPreContent, output.PreContent.GetContent()); Assert.Equal(expectedContent, output.Content.GetContent()); Assert.Equal(expectedPostContent, HtmlContentUtilities.HtmlContentToString(output.PostContent)); Assert.Equal(expectedTagName, output.TagName); Assert.Single( tagHelperContext.Items, entry => (Type)entry.Key == typeof(SelectTagHelper)); Assert.Equal(savedDisabled, items.Select(item => item.Disabled)); Assert.Equal(savedGroup, items.Select(item => item.Group)); Assert.Equal(savedSelected, items.Select(item => item.Selected)); Assert.Equal(savedText, items.Select(item => item.Text)); Assert.Equal(savedValue, items.Select(item => item.Value)); }
public async Task ProcessAsync_WithItems_AndNoModelExpression_GeneratesExpectedOutput() { // Arrange var originalAttributes = new TagHelperAttributeList { { "class", "form-control" }, }; var originalPostContent = "original content"; var expectedAttributes = new TagHelperAttributeList(originalAttributes); var selectItems = new SelectList(Enumerable.Range(0, 5)); var expectedOptions = "<option>HtmlEncode[[0]]</option>" + Environment.NewLine + "<option>HtmlEncode[[1]]</option>" + Environment.NewLine + "<option>HtmlEncode[[2]]</option>" + Environment.NewLine + "<option>HtmlEncode[[3]]</option>" + Environment.NewLine + "<option>HtmlEncode[[4]]</option>" + Environment.NewLine; var expectedPreContent = "original pre-content"; var expectedContent = "original content"; var expectedPostContent = originalPostContent + expectedOptions; var expectedTagName = "select"; var tagHelperContext = new TagHelperContext( tagName: "select", allAttributes: new TagHelperAttributeList( Enumerable.Empty <TagHelperAttribute>()), items: new Dictionary <object, object>(), uniqueId: "test"); var output = new TagHelperOutput( expectedTagName, originalAttributes, getChildContentAsync: (useCachedResult, encoder) => { var tagHelperContent = new DefaultTagHelperContent(); tagHelperContent.AppendHtml("Something"); return(Task.FromResult <TagHelperContent>(tagHelperContent)); }) { TagMode = TagMode.SelfClosing, }; output.PreContent.AppendHtml(expectedPreContent); output.Content.AppendHtml(expectedContent); output.PostContent.AppendHtml(originalPostContent); var metadataProvider = new TestModelMetadataProvider(); var htmlGenerator = new TestableHtmlGenerator(metadataProvider); var viewContext = TestableHtmlGenerator.GetViewContext( model: null, htmlGenerator: htmlGenerator, metadataProvider: metadataProvider); var tagHelper = new SelectTagHelper(htmlGenerator) { Items = selectItems, ViewContext = viewContext, }; // Act tagHelper.Init(tagHelperContext); await tagHelper.ProcessAsync(tagHelperContext, output); // Assert Assert.Equal(TagMode.SelfClosing, output.TagMode); Assert.Equal(expectedAttributes, output.Attributes); Assert.Equal(expectedPreContent, output.PreContent.GetContent()); Assert.Equal(expectedContent, output.Content.GetContent()); Assert.Equal(expectedPostContent, HtmlContentUtilities.HtmlContentToString(output.PostContent)); Assert.Equal(expectedTagName, output.TagName); var kvp = Assert.Single(tagHelperContext.Items); Assert.Equal(typeof(SelectTagHelper), kvp.Key); Assert.Null(kvp.Value); }
public async Task ProcessAsync_WithError_RendersExpectedOutput() { // Arrange var context = new TagHelperContext( tagName: "govuk-select", allAttributes: new TagHelperAttributeList(), items: new Dictionary <object, object>(), uniqueId: "test"); var output = new TagHelperOutput( "govuk-select", attributes: new TagHelperAttributeList(), getChildContentAsync: (useCachedResult, encoder) => { var selectContext = context.GetContextItem <SelectContext>(); selectContext.SetLabel( isPageHeading: false, attributes: null, content: new HtmlString("The label")); selectContext.SetHint( attributes: null, content: new HtmlString("The hint")); selectContext.SetErrorMessage( visuallyHiddenText: null, attributes: null, content: new HtmlString("The error")); selectContext.AddItem(new SelectItem() { Content = new HtmlString("First") }); var tagHelperContent = new DefaultTagHelperContent(); return(Task.FromResult <TagHelperContent>(tagHelperContent)); }); var tagHelper = new SelectTagHelper() { Id = "my-id", DescribedBy = "describedby", Name = "my-name" }; // Act await tagHelper.ProcessAsync(context, output); // Assert var expectedHtml = @" <div class=""govuk-form-group govuk-form-group--error""> <label for=""my-id"" class=""govuk-label"">The label</label> <div id=""my-id-hint"" class=""govuk-hint"">The hint</div> <p id=""my-id-error"" class=""govuk-error-message""> <span class=""govuk-visually-hidden"">Error:</span> The error </p> <select aria-describedby=""describedby my-id-hint my-id-error"" class=""govuk-select govuk-select--error"" id=""my-id"" name=""my-name""> <option>First</option> </select> </div>"; AssertEx.HtmlEqual(expectedHtml, output.RenderToString()); }
/// <summary> /// 初始化类<see cref="SelectableTagHelper"/>。 /// </summary> /// <param name="generator">Html辅助接口。</param> protected SelectableTagHelper(IHtmlGenerator generator) { _selectTagHelper = new SelectTagHelper(generator); }
public async Task ProcessAsync_GeneratesExpectedOutput( object model, Type containerType, Func <object> modelAccessor, NameAndId nameAndId, string ignored) { // Arrange var originalAttributes = new TagHelperAttributeList { { "class", "form-control" }, }; var originalPostContent = "original content"; var expectedAttributes = new TagHelperAttributeList(originalAttributes) { { "id", nameAndId.Id }, { "name", nameAndId.Name }, { "valid", "from validation attributes" }, }; var expectedPreContent = "original pre-content"; var expectedContent = "original content"; var expectedPostContent = originalPostContent; var expectedTagName = "not-select"; var metadataProvider = new TestModelMetadataProvider(); var containerMetadata = metadataProvider.GetMetadataForType(containerType); var containerExplorer = metadataProvider.GetModelExplorerForType(containerType, model); var propertyMetadata = metadataProvider.GetMetadataForProperty(containerType, "Text"); var modelExplorer = containerExplorer.GetExplorerForExpression(propertyMetadata, modelAccessor()); var modelExpression = new ModelExpression(nameAndId.Name, modelExplorer); var tagHelperContext = new TagHelperContext( tagName: "select", allAttributes: new TagHelperAttributeList( Enumerable.Empty <TagHelperAttribute>()), items: new Dictionary <object, object>(), uniqueId: "test"); var output = new TagHelperOutput( expectedTagName, originalAttributes, getChildContentAsync: (useCachedResult, encoder) => { var tagHelperContent = new DefaultTagHelperContent(); tagHelperContent.SetContent("Something"); return(Task.FromResult <TagHelperContent>(tagHelperContent)); }) { TagMode = TagMode.SelfClosing, }; output.PreContent.SetContent(expectedPreContent); output.Content.SetContent(expectedContent); output.PostContent.SetContent(originalPostContent); var htmlGenerator = new TestableHtmlGenerator(metadataProvider) { ValidationAttributes = { { "valid", "from validation attributes" }, } }; var viewContext = TestableHtmlGenerator.GetViewContext(model, htmlGenerator, metadataProvider); var tagHelper = new SelectTagHelper(htmlGenerator) { For = modelExpression, ViewContext = viewContext, }; // Act tagHelper.Init(tagHelperContext); await tagHelper.ProcessAsync(tagHelperContext, output); // Assert Assert.Equal(TagMode.SelfClosing, output.TagMode); Assert.Equal(expectedAttributes, output.Attributes); Assert.Equal(expectedPreContent, output.PreContent.GetContent()); Assert.Equal(expectedContent, output.Content.GetContent()); Assert.Equal(expectedPostContent, output.PostContent.GetContent()); Assert.Equal(expectedTagName, output.TagName); Assert.Single( tagHelperContext.Items, entry => (Type)entry.Key == typeof(SelectTagHelper)); }
/// <summary> /// 测试初始化 /// </summary> public SelectTagHelperTest(ITestOutputHelper output) { _output = output; _component = new SelectTagHelper(); Config.IsValidate = false; }
public async Task ProcessAsync_GeneratesExpectedOutput() { // Arrange var context = new TagHelperContext( tagName: "govuk-select", allAttributes: new TagHelperAttributeList(), items: new Dictionary <object, object>(), uniqueId: "test"); var output = new TagHelperOutput( "govuk-select", attributes: new TagHelperAttributeList(), getChildContentAsync: (useCachedResult, encoder) => { var selectContext = context.GetContextItem <SelectContext>(); selectContext.SetLabel( isPageHeading: false, attributes: null, content: new HtmlString("The label")); selectContext.SetHint( attributes: null, content: new HtmlString("The hint")); selectContext.AddItem(new SelectItem() { Content = new HtmlString("First") }); selectContext.AddItem(new SelectItem() { Content = new HtmlString("Second"), Value = "second" }); selectContext.AddItem(new SelectItem() { Content = new HtmlString("Third"), Disabled = true, Value = "third" }); selectContext.AddItem(new SelectItem() { Content = new HtmlString("Fourth"), Selected = true, Value = "fourth" }); var tagHelperContent = new DefaultTagHelperContent(); return(Task.FromResult <TagHelperContent>(tagHelperContent)); }); var tagHelper = new SelectTagHelper() { Id = "my-id", DescribedBy = "describedby", Name = "my-name" }; // Act await tagHelper.ProcessAsync(context, output); // Assert var expectedHtml = @" <div class=""govuk-form-group""> <label for=""my-id"" class=""govuk-label"">The label</label> <div id=""my-id-hint"" class=""govuk-hint"">The hint</div> <select aria-describedby=""describedby my-id-hint"" class=""govuk-select"" id=""my-id"" name=""my-name""> <option>First</option> <option value=""second"">Second</option> <option disabled=""disabled"" value=""third"">Third</option> <option selected=""selected"" value=""fourth"">Fourth</option> </select> </div>"; AssertEx.HtmlEqual(expectedHtml, output.RenderToString()); }