ASP.NET 核心中的单元测试标签助手 - 填充标签 Public 属性

Unit Testing Tag Helper in ASP.NET Core - Populating Tag Public Properties

尝试在新项目上实施最佳实践,我想看看我可以将单元测试扩展到 MVC 标签帮助器的程度。在本例中,我有一个非常简单的助手,取自 MVC documentation 的 Tag Helper 部分,所以现在我有 <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-case mail-to 正确填充了 camel-case MailTo 在 C# 中 class.

现在我有以下单元测试:

[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);
}

第一个断言正在通过,如果我在标签助手内部设置断点 class 我可以看到属性与 运行 应用程序正常时传递的属性相匹配,但由于某种原因Pascal 到驼峰大小写的映射 MailTo 在测试期间没有发生。

我的工作基于在 Github 上找到的 MVC Tag Helper Unit Tests 的源代码,但我想我遗漏了一些东西。

任何建议,或者我是否必须在我的测试中设置 emailHelper.MailTo,老实说,如果是这样的话,这似乎有点逃避答案:(希望这只是我忽略的一个细微差别!

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

emailHelper.MialTo = "Support";

表示这行代码

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

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

在您的代码自定义实现中,您没有在任何地方访问上下文,因此按理说,除非您实际设置 MailTo 属性,否则当 Process 为在单元测试中调用。

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