单元测试私有方法
本文关键字:有方法 单元测试 | 更新日期: 2023-09-27 18:23:49
首先,我知道关于这个主题有很多问题。我读过其中的大部分,但我真的不知道是缺乏适当的OO编程,还是我遗漏了一些东西。
所以我有一个类xmlRead
,它将XML文件读入一些列表。我想单元测试这个类。我认为最简单的开始方法是测试addDataToList()
。但这是一种私人方法。所以我想知道是应该将其公开,还是测试公共方法ReadTheXmlFile()。
public class xmlRead
{
List<string> ... // A couple of lists that need to filled with data from the XML document
xmlDocument xDoc = new xmlDocument
public void ReadTheXmlFile()
{
// Find default file, if it doesn't exist, ask user for file through Openfiledialog
// and open XMLDocument + error handling if XMLdocument is empty etc.
xDoc.load(filepath);
takeInXmlData();
}
private void takeInXmlData()
{
addDataToList(list<string> list1, xmlNode 1);
// More addDataToList for different lists
...
addDataToList(list<string> list2, xmlNode 2);
}
private void addDataToList(list<string> inputList, xmlNode)
{
foreach (XmlNode node in xmlDoc.SelectNodes(xmlNode))
{
inputList.Add(node.SelectSingleNode("Specific name of node").InnerText);
}
}
所以我尽量把事情分开。但这也意味着我的方法addDataToList
非常小,但很容易进行单元测试。但我也觉得这也不应该是一种公开的方法。当然,我可以测试公共方法ReadTheXmlFile()
,但随后我必须为错误检测的每个结果制定特定的测试用例,在我看来,我不会正确地测试列表中的实际数据摄入。
我是不是太过保护了?我应该公开addDateToList
(或takeInXmlData
)吗?或者我应该只测试公共方法ReadTheXmlFile
,直到我考虑了所有可能的方法?
这感觉像是一大堆工作,有点违背了简短、简单的单元测试的原则。
附言:不必担心我在这里直接加载xDoc,我有一个接口来管理XML文档的加载(我可以稍后将其存根以打破依赖关系)。这里的重点是私有方法。
您可以使用InternalsVisibleTo属性来允许单元测试查看您的方法,同时对世界其他地方保持私有。
Reflection允许您从类外部调用私有方法和读取或写入私有字段,但编写起来确实很繁琐。
在C#4.0中,使用动态类型可以以一种巧妙的方式解决这个问题。
如果您可以在单元测试中使用C#4.0,请查看本文:
用C#4.0 测试私有方法
一个简单的用法:
public class Service {
private int Step1() {
return 1;
}
}
[TestClass]
public class TransparentObjectTests {
[TestMethod]
public void PrivateMethod() {
dynamic s = new Service().AsTransparentObject();
Assert.AreEqual(1, s.Step1());
}
}
您的addDateToList
方法是实现细节。您想要并且应该测试的是ReadTheXmlFile
方法。你甚至已经发现了应该测试的东西:
找到默认文件,如果它不存在,请通过Openfiledialog向用户请求文件,并打开XMLDocument+错误处理(如果XMLDocument为空)等
- 测试find失败时会发生什么(这听起来像是外部依赖性作业tho)
- 测试错误处理
- 测试XML文档为空
- 成功后返回测试属性XML(这将隐式测试私有方法)
关于这个:
当然,我可以测试公共方法ReadTheXmlFile(),但之后我必须为错误检测的每个结果制定特定的测试用例,在我看来,我无法正确地测试列表中的实际数据摄入。
这就是你应该做的。如果你的方法有多个可能的错误结果,那么每个结果都应该经过测试。没有比这更简单的了。大多数框架通过NUnit的TestCase等属性使这(多输入/输出测试)变得非常容易。
顺便说一句,如果您发现自己非常需要测试私有方法,这通常是一个很好的指标,表明您的类做了太多的事情,将私有方法的功能提取到外部对象可能值得考虑。
您可以尝试,
打开AssemblyInfo.cs文件。添加此代码,
[assembly: InternalsVisibleTo("Your Test Library Name")]
然后,将私有更改为内部
您可以在XmlRead类中为内部方法编写测试。