尝试在一个新项目上实施最佳实践,我发现我可以将单元测试扩展到MVC Tag Helpers的范围。在这种情况下,我从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大小写mail-to
正确地填充MailTo
了C#类中的camel-case 。
现在,我有以下单元测试:
[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);
}
第一个断言正在传递,如果我在标记帮助器类中设置断点,则可以看到属性与正常运行应用程序时传递的属性相匹配,但是由于某些原因,MailTo
在测试过程中未将pascal映射到驼峰大小写。
我的工作基于在Github上找到的MVC标签帮助器单元测试的源代码,但我想我缺少一些东西。
任何建议还是我必须emailHelper.MailTo
在测试中提出的建议,老实说,如果这样的话,这似乎是个小小的答案:(希望这只是我忽略的细微差别!
看来您没有在被测系统上设置属性。
即
emailHelper.MialTo = "Support";
这意味着这行代码
var addr = $"{MailTo}@{EmailDomain}";
如果MailTo
在处理时为空,则不会生成预期的电子邮件地址。
在您的代码定制实现中,您无法访问上下文,因此可以推断出除非您实际设置了MailTo
属性,否则Process
在单元测试中调用该属性时,它将没有值。
当在实时代码中运行时,框架将为您解释剃刀并为您填充属性,但在单元测试中并非如此。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句