【问题标题】:Unit test to check for unused properties单元测试以检查未使用的属性
【发布时间】:2019-06-18 12:07:07
【问题描述】:

我有一个函数,它遍历类的属性,并替换模板中两个具有相同名称的美元符号之间的关键字。

一个类的例子:

public class FeedMessageData : IMailObject
{
    public string Username { get; private set;}
    public string SubscriptionID { get; private set; }
    public string MessageTime { get; private set; }
    public string Subject { get; private set; }

    public FeedMessageData(string username, string subscriptionID, DateTime messageTime)
    {
        this.Username = username;
        this.SubscriptionID = subscriptionID;
        this.MessageTime = messageTime.ToShortDateString();

        this.Subject = "Feed " + DateTime.Now + " - SubscriptionID: " + this.SubscriptionID;
    }
}

这是用属性替换模板的功能:

private string mergeTemplate(string template, IMailObject mailObject)
{
    Regex parser = new Regex(@"\$(?:(?<operation>[\w\-\,\.]+) ){0,1}(?<value>[\w\-\,\.]+)\$", RegexOptions.Compiled);

    var matches = parser.Matches(template).Cast<Match>().Reverse();
    foreach (var match in matches)
    {
        string operation = match.Groups["operation"].Value;
        string value = match.Groups["value"].Value;

        var propertyInfo = mailObject.GetType().GetProperty(value);
        if (propertyInfo == null)
            throw new TillitException(String.Format("Could not find '{0}' in object of type '{1}'.", value, mailObject));

        object dataValue = propertyInfo.GetValue(mailObject, null);

        template = template.Remove(match.Index, match.Length).Insert(match.Index, dataValue.ToString());
    }
    return template;
}

我正在寻找创建一个单元测试来写入控制台,模板中未使用的可能属性。例如,如果模板中没有 $SubscriptionID$。我尝试使用 PropertyInfo,它为我提供了类的属性,但是我如何使用这些信息来检查它们是否已在模板中使用?

【问题讨论】:

  • 您能否指出您尝试过的方法以及遇到特定问题的地方。根据您的描述,您或多或少是在找人为您编写代码,而不是帮助您解决问题。脱离我的头顶单元测试平台,例如XUnit 提供验证机制,您可以在其中验证属性/方法是否已被调用。您是否尝试过探索这些选项?
  • @gerryc.inc 我可以看到措辞如何让我看起来只是想要为我编写的代码,但是我不会学到任何东西。我尝试的是通过 PropertyInfo 获取正在使用的属性,但是一旦有了这些,我就不确定应该如何检查模板中是否使用了该值。我一直在尝试的另一个想法是使用正则表达式来检查美元符号之间的单词,但这只会给我模板中的单词,我已经对其进行了测试。
  • 查看我的答案以获取使用 Moq 的示例。我希望它能让你朝着正确的方向开始。

标签: c# regex unit-testing reflection nunit


【解决方案1】:

Moq (https://github.com/moq/moq4/wiki) 提供了验证属性/方法访问权限的方法。 请按照this link 上的教程了解更多详细信息。要验证您的属性是否在模板中使用,您可以使用VerifyGet 方法,示例如下:

[Fact]
public void VerifyAllPropertiesHaveBeenConsumedInTemplate()
{
    var mockMailObject = new Mock<IMailObject>();
    var template = "yourTemplateOrMethodThatReturnsYourTemplate";

    var result = mergeTemplate(template, mockMailObject.Object);

    mockMailObject.VerifyGet(m => m.Username, Times.Once);
    mockMailObject.VerifyGet(m => m.SubscriptionID, Times.Once);
    mockMailObject.VerifyGet(m => m.MessageTime, Times.Once);
    mockMailObject.VerifyGet(m => m.Subject, Times.Once);
}

【讨论】:

  • 谢谢,帮了大忙。我正在做的工作在某种意义上是有效的,但我无法根据模板本身检查它
  • 乐于助人。如果您满意,介意标记为答案吗?
猜你喜欢
  • 2019-10-23
  • 2015-10-20
  • 2012-06-26
  • 2017-07-27
  • 1970-01-01
  • 2016-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多