gpt4 book ai didi

c# - 私有(private)属性(property)的设定值

转载 作者:行者123 更新时间:2023-11-30 17:07:53 25 4
gpt4 key购买 nike

我正在尝试测试我的类(class)

public class Parser
{

private static IDictionary<String, Regex> PhrasesToRegexp { get; set; }

public static void InitPhrases(IList<String> Phrases, Boolean useDeclination )
{
throw new NotImplementedException();
}

...

public ParsingResults Find(String source)
{
HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(source);
return new ParsingResults(FindUrls(doc), CountPhrases(doc));
}



private IList<String> FindUrls(HtmlDocument source)
{
return source.DocumentNode.SelectNodes("//a[@href]").
Select(link => link.GetAttributeValue("href", "")).ToList();
}

private IDictionary<String, int> CountPhrases(HtmlDocument source)
{
IDictionary<String, int> results = new Dictionary<String, int>();
foreach (String key in PhrasesToRegexp.Keys)
{
results.Add( key , 0 );
}

foreach (HtmlNode node in source.DocumentNode.SelectNodes("//p"))
{
foreach (String phrase in results.Keys)
{
results[phrase] += PhrasesToRegexp[phrase].Matches
(Regex.Replace(node.InnerText, @"<(.|\n)*?>", string.Empty)).Count;
}
}
return results;
}

}

问题是属性 PhrasesToRegexp 已(将)在 InitPhrases 中初始化,我正在尝试为方法 Find 编写单元测试。基本上我需要设置这个私有(private)属性的值 PhrasesToRegexp。有什么办法吗?我不是模拟方面的专家,但我认为他们不会成功,因为这个属性和测试方法在同一个对象中。

最佳答案

您可以添加一个专门用于单元测试的新构造函数,但我建议尽量减少对您的类进行的任何更改以使其可进行单元测试。支持单元测试的特化通常意味着您没有测试将在最终应用程序中运行的实际代码。您对它的特化程度越高,就越难确保真正的代码得到了全面测试,并且越有可能将不需要的副作用引入被测代码。

相反,(如果可能的话)我尝试像客户端一样使用该类 - 如果您构建实例并像客户端那样调用方法,您就不需要在私有(private)状态下四处寻找,并且您的单元测试将准确测试任何客户端代码将使用的内容。此外,如果您更改类的内部工作方式,您的测试更有可能保持有效/有效,因为没有用于单元测试的特殊途径,您可能会忘记与代码更改保持同步。

如果您更喜欢公开该属性并直接生成它,则将其更改为 internal 并使用 InternalsVisibleTo 是一种标准方法,但它违背了我的封装感它成为每个人的永久内在。另一个程序员怎么知道你的意思是“内部测试”而不是“嘿,我们是好 friend ,请尽情享受我的内部状态”。如果我们想单元测试时就把它扔掉,那 private 有什么用呢?因此,另一种保持代码私有(private)的方法是使用特殊构建进行单元测试,它设置一个#define 以允许您公开要访问的私有(private)代码以进行测试,同时在正常构建中将它们保留为私有(private)。

一种方法是对属性本身进行暴力破解(但这可能非常困惑):

#if UNIT_TEST
public
#else
private
#endif
int MyPrivateProperty { get; set; }

或者,一种更简洁的方法(但需要更多工作)是保持原始代码完好无损并添加访问方法,以最大限度地减少您无意中破坏/更改被测代码的可能性。

private int MyProperty { get; set; }

#if UNIT_TEST
public int AccessMyProperty
{
get { return(MyProperty); }
set { MyProperty = value; }
}
#endif

关于c# - 私有(private)属性(property)的设定值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14187672/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com