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
为在单元测试中调用。
当在实时代码中 运行 时,框架会解释剃刀并为您填充 属性,但在单元测试中情况并非如此。
尝试在新项目上实施最佳实践,我想看看我可以将单元测试扩展到 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
为在单元测试中调用。
当在实时代码中 运行 时,框架会解释剃刀并为您填充 属性,但在单元测试中情况并非如此。