在核心 ASP.NET 对标记帮助程序进行单元测试 - 填充标记公共属性



尝试在新项目上实现最佳实践,我想看看我可以在多大程度上将单元测试扩展到MVC标签助手。在这种情况下,我有一个非常简单的帮助程序,取自 MVC 文档的标记帮助程序部分,所以现在我有<email mail-to="Support"></email>.

实际代码如下。

public class EmailTagHelper : TagHelper
{
private const string EmailDomain = "contoso.com";
public string MailTo { get; set; }
public override void Process(TagHelperContext ctx, TagHelperOutput output)
{
output.TagName = "a";
var addr = $"{MailTo}@{EmailDomain}";
output.Attributes.SetAttribute("href", $"mailto:{addr}");
output.Content.SetContent(addr);
}
}

生成的 HTML 符合预期,如果我在运行代码时设置断点,我可以看到 pascal-casemail-to正在正确填充 C# 类中的驼峰大小写MailTo

现在我有以下单元测试:

[TestMethod]        
public void EmailTagHelper_GeneratesExpectedHtml()
{
var emailHelper = new EmailTagHelper();
var ctx = new TagHelperContext(new TagHelperAttributeList
{
{"mail-to", "Support"}
}, new Dictionary<object, object>(), Guid.NewGuid().ToString("N"));
var output = new TagHelperOutput("email",
new TagHelperAttributeList(), (useCachedResult, htmlEncoder) =>
{
var tagHelperContent = new DefaultTagHelperContent();
tagHelperContent.SetContent(string.Empty);
return Task.FromResult<TagHelperContent>(tagHelperContent);
});
emailHelper.Process(ctx, output);
Assert.AreEqual("a", output.TagName);
Assert.AreEqual("mailto:Support@contoso.com", output.Attributes["href"].Value);
}

第一个断言是传递的,如果我在标记帮助程序类内断点,我可以看到属性与正常运行应用程序时传递的属性匹配,但由于某种原因,在测试期间没有发生 pascal 到 Camel 大小写MailTo的映射。

我的工作基于在 Github 上找到的 MVC 标签助手单元测试的源代码,但我认为我错过了一些东西。

任何建议或我将不得不在我的测试中设置emailHelper.MailTo,老实说,如果是这样的话,这似乎是一个警察的答案:(希望这只是我忽略的细微差别!

看起来您没有在受测系统上设置该属性。

emailHelper.MialTo = "Support";

这意味着这行代码

var addr = $"{MailTo}@{EmailDomain}";

如果在处理时MailTo为空,则不会生成预期的电子邮件地址。

在代码自定义实现中,您不会访问上下文,因此除非您实际设置MailTo属性,否则在单元测试中调用Process时它不会有值。

在实时代码中运行时,框架会解释 razor 并为您填充属性,但在单元测试中并非如此。

最新更新