unit-testing - Unit Testing a custom TagHelper where HTML conditionally rendered based on the presence of a ValidationAttribute on the model Property
问题描述
I have a custom TagHelper which extends the OOTB InputTagHelper. I am conditionally adding attributes to it based on the presence of a custom ValidationAttribute on the model property associated with it. The code for this in the TagHelper .Process
method works fine:
if (this.For.Metadata.ValidatorMetadata.OfType<NumericValidationAttribute>().Any())
{
output?.Attributes.SetAttribute(new TagHelperAttribute("inputmode", "numeric"));
output?.Attributes.SetAttribute(new TagHelperAttribute("pattern", "[0-9]*"));
}
My issue is in Unit Testing this. I have other Unit Tests written using the code available in the Net Core MVC Test repo: https://github.com/aspnet/Mvc/blob/master/test/Microsoft.AspNetCore.Mvc.TagHelpers.Test/
... but there's no real steer on how to create the For
i.e ModelExpression
for the property I want to test which has this Validation attribute associated with it: e.g.
public class TestModel
{
[NumericValidation(ErrorMessage = "Error message")]
public string Field1 { get; set; }
}
I want to be able to populate the For.Metadata.ValidatorMetadata
list for this ModelExpression and I don't know how.
The full Unit Test which doesnt work is:
[Fact]
public void CustomInputTagHelperProcess_NumericValidationAttributeOnModelProperty_GeneratesCorrectHtml()
{
// Arrange
var metadataProvider = new EmptyModelMetadataProvider();
var htmlGenerator = new TestableHtmlGenerator(metadataProvider);
var model = new TestModel
{
Field1 = "cc",
};
var modelExplorer = metadataProvider.GetModelExplorerForType(typeof(TestModel), model);
var modelExpression = new ModelExpression(name: "Field1", modelExplorer: modelExplorer);
var viewContext = TestableHtmlGenerator.GetViewContext(model, metadataProvider);
var attributes = new TagHelperAttributeList
{
{ "name", PropertyName },
{ "type", InputTypeName },
};
var tagHelperContext = new TagHelperContext(attributes, new Dictionary<object, object>(), nameof(CustomInputTagHelperTest));
var output = new TagHelperOutput(
Input,
new TagHelperAttributeList(),
getChildContentAsync: (useCachedResult, encoder) => Task.FromResult<TagHelperContent>(result: null))
{
TagMode = TagMode.SelfClosing,
};
var customInputTagHelper = new CustomInputTagHelper(this.htmlGenerator)
{
For = this.modelExpression,
InputTypeName = InputTypeName,
Name = PropertyName,
ViewContext = this.viewContext,
};
// Act
customInputTagHelper.Process(this.tagHelperContext, output);
// Assert - ensure we have an inputmode attribute on the input.
Assert.Contains(output.Attributes, x => x.Name == "inputmode" && x.Value.ToString() == "numeric");
}
Any thoughts?
解决方案
推荐阅读
- python - 使用 columns.fillna(column.mean) 在两列数据框中删除空格和填充 nan 时遇到问题
- rabbitmq - 重复的客户端 ID - 可能的 ddos
- c++ - C ++将字符串调用到函数中?
- xslt - 仅从当前计数将数学转换为 %Reported
- python - 如何正确键入异步类实例变量
- r - 删除R中的尾随零和小数点
- date - 如何配置我的 Postman 模拟服务器响应以始终返回两天前的日期?
- r - 错误 openxlsx can only read .xlsx files When loading .xlsx files
- python - 使 Docker 容器使用安装的最新版本的 Python
- html - 无法理解深层链接和意图