2017-04-10 73 views
2

试图在新项目上实现最佳实践,我想我会看到我能够将单元测试扩展到MVC标签助手多远。在这种情况下,我从MVC documentation的标签助手部分获得了一个非常简单的帮助,所以现在我有<email mail-to="Support"></email>ASP.NET Core中的单元测试标签助手 - 填充标签公共属性

实际的代码如下。

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是如预期,如果我运行代码时设置断点我可以看到帕斯卡 - 壳体mail-to被正确填充骆驼情况MailTo C#的类中。

现在我有以下的单元测试:

[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:[email protected]", output.Attributes["href"].Value); 
} 

的第一个断言被传递,如果我断点标记辅助类里面我可以看到,属性相匹配的正常运行应用程序时要传递,但由于某种原因,在测试过程中不会出现pascal到骆驼案例MailTo的映射。

我将我的工作放在Github上的MVC Tag Helper Unit Tests的源代码上,但我认为我错过了一些东西。

任何意见还是我将不得不设置emailHelper.MailTo在我的测试,这在所有诚实似乎有点像一个警察出来的答案,如果这样:(的希望能这只是我俯瞰着细微的差别!

回答

3

外貌就像你没有在测试设置系统的性能。

emailHelper.MialTo = "Support"; 

这意味着这行代码

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

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

没有在你的代码自定义实现中你访问上下文的地方,所以有理由认为,除非你真的设置了MailTo属性,否则在单元测试中调用Process时它不会有值。

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

+0

这是我的怀疑,Razor在标签助手实际上被允许运行之前以某种方式参与并执行映射....有点讨厌他们已经完成了IMO,但我可以明白为什么他们已经完成了它。我将不得不看看我是否可以找到这种情况,并可能实施测试版本。 一切都一样,感谢您的输入!正在沿着正确的路线工作,至少:) –

+0

我也许以为调用'emailHelper.Init(ctx)'可能会处理这个,但它似乎完全在这个TagHelper类之外处理;不知何故。 –

+0

@JakHammond是的,我建议您查看您在OP中链接的测试。我注意到他们可能正在创建视图上下文并将其分配给助手来执行您所期望的操作。检查此测试https://github.com/aspnet/Mvc/blob/dev/test/Microsoft.AspNetCore.Mvc.TagHelpers.Test/TextAreaTagHelperTest.cs#L150 – Nkosi