[英]Unit testing private method
首先,我知道有关此主题有很多问题。 我已经阅读了其中的大多数内容,但是我真的不知道是否缺少适当的OO编程,或者是否缺少某些内容。
因此,我有一个xmlRead
类, 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
?
感觉就像很多工作,这违反了简短,简单的单元测试的原则。
PS:不用担心我直接在这里加载xDoc的事实,我有一个接口来管理XML文档的加载(以后可以存根以打破依赖关系)。 这里的重点是私有方法。
您可以使用InternalsVisibleTo属性来使单元测试看到您的方法,同时将其私有化。
反射允许您调用私有方法并从类外部读取或写入私有字段,但是编写起来确实很冗长。
在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
方法。 您甚至已经发现应该测试的内容:
查找默认文件(如果不存在),请通过Openfile对话框询问用户文件,并打开XMLDocument +错误处理(如果XMLdocument为空等)。
关于此:
我当然可以测试公共方法ReadTheXmlFile(),但是随后我必须针对错误检测的每个结果制作特定的测试用例,并且我认为我不会适当地测试列表中的实际数据摄入量。
那确实是你应该做的。 如果您的方法有多个可能的错误结果,则应对每个结果进行测试。 没有比这更简单的了。 大多数框架都使用NUnit的TestCase等属性使此操作(多次输入/输出测试)非常容易。
在旁注中,如果您发现自己非常需要测试私有方法,则通常可以很好地表明您的类正在做过多的事情,并且可能需要考虑将私有方法的功能提取到外部对象。
你可以试试,
打开AssemblyInfo.cs文件。 添加此代码,
[assembly: InternalsVisibleTo("Your Test Library Name")]
然后,将专用-更改为-内部
您可以在XmlRead类中为内部方法编写测试。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.