Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 检查未使用属性的单元测试_C#_Regex_Unit Testing_Reflection_Nunit - Fatal编程技术网

C# 检查未使用属性的单元测试

C# 检查未使用属性的单元测试,c#,regex,unit-testing,reflection,nunit,C#,Regex,Unit Testing,Reflection,Nunit,我有一个函数,它遍历类的属性,并用模板中的相同名称替换两个美元符号之间的关键字 一个类的示例: public class FeedMessageData : IMailObject { public string Username { get; private set;} public string SubscriptionID { get; private set; } public string MessageTime { get; private set; }

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

一个类的示例:

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;
    }
}
这是用属性替换模板的函数:

私有字符串合并模板(字符串模板,IMailObject mailObject)
{
正则表达式解析器=新正则表达式(@“\$(?:(?[\w\-\,\.]+){0,1}(?[\w\-\,\.]+)\$”,RegexOptions.Compiled);
var matches=parser.matches(template.Cast().Reverse();
foreach(匹配中的变量匹配)
{
字符串操作=匹配。组[“操作”]。值;
字符串值=匹配。组[“值”]。值;
var propertyInfo=mailObject.GetType().GetProperty(值);
如果(propertyInfo==null)
抛出新的TilliteException(String.Format(“在类型为“{1}.”的对象中找不到“{0}”,value,mailObject));
object dataValue=propertyInfo.GetValue(mailObject,null);
template=template.Remove(match.Index,match.Length).Insert(match.Index,dataValue.ToString());
}
返回模板;
}
我希望创建一个单元测试,将模板中未使用的可能属性写入控制台。例如,如果模板中没有$SubscriptionID$。我尝试过使用PropertyInfo,它提供了类的属性,但是如何使用这些信息来检查它们是否已经在模板中使用过?

Moq()提供了验证属性/方法访问的方法。 有关详细信息,请按照上的教程进行操作。要验证您的属性是否正在模板中使用,您可以使用
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);
}
[事实]
public void VerifyAllPropertieShareBeenConsumedTemplate()
{
var mockMailObject=new Mock();
var template=“yourTemplateOrMethodThatReturnsYourTemplate”;
var result=mergeTemplate(模板,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.one);
}

您能否指出您尝试了什么以及您在哪里遇到了特定问题。从您的描述来看,您或多或少是在寻找一个为您编写代码的人,而不是帮助您解决问题。在我的顶层单元测试平台上,例如XUnit提供了验证机制,您可以在其中验证是否调用了属性/方法。你有没有尝试过探索这样的选项?@gerryc.inc我可以看出措辞让人觉得我只是想为自己编写代码,但那样我就什么也学不到了。我尝试的是通过PropertyInfo获取正在使用的属性,但一旦获得了这些属性,我就不确定应该如何检查模板中是否使用了该值。我一直在尝试的另一个想法是使用Regex检查美元符号之间的单词,但这只给了我模板中的单词,我已经对其进行了测试。使用Moq检查我的答案。我希望它能让你朝着正确的方向开始。谢谢你,这很有帮助。我所做的工作在某种意义上是有效的,但我无法对照模板进行检查,而模板本身很乐意提供帮助。如果您感到满意,是否介意标记为答案?