C# 单元测试私有方法
首先,我知道关于这个话题有很多问题。我读过其中的大部分,但我真的不知道这是因为缺乏正确的面向对象编程,还是我遗漏了什么 所以我有一个xmlRead类,它将XML文件读入一些列表。我想对这个类进行单元测试。我认为最简单的方法是测试addDataToList。但这是一种私人方法。所以我想知道是应该将其公开,还是测试公共方法ReadTheXmlFileC# 单元测试私有方法,c#,unit-testing,C#,Unit Testing,首先,我知道关于这个话题有很多问题。我读过其中的大部分,但我真的不知道这是因为缺乏正确的面向对象编程,还是我遗漏了什么 所以我有一个xmlRead类,它将XML文件读入一些列表。我想对这个类进行单元测试。我认为最简单的方法是测试addDataToList。但这是一种私人方法。所以我想知道是应该将其公开,还是测试公共方法ReadTheXmlFile public class xmlRead { List<string> ... // A couple of lists tha
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非常小,但很容易进行单元测试。但我也觉得这不应该是一种公开的方法。当然,我可以测试公共方法读取XML文件,但随后我必须为错误检测的每个结果制作特定的测试用例,而且在我看来,我不会正确地测试列表中的实际数据量
我是不是保护过度了,应该将addDateToList或takeInXmlData公开?或者我应该只测试公共方法ReadTheXmlFile,直到我考虑了所有可能的方法
这感觉像是做了很多工作,这有点违背了简短、简单的单元测试的原则
PS:不必担心我直接在这里加载xDoc,我有一个接口来管理XML文档的加载,稍后我可以对其进行存根以打破依赖关系。这里的重点是私有方法。您可以使用该属性允许单元测试查看您的方法,同时为世界其他地区保持私有。您可以使用该属性允许单元测试查看您的方法,同时为世界其他地区保持私有。您的addDateToList方法正在实现中细节您想要并且应该测试的是读取xmlfile方法。您甚至已经发现了应该测试的内容:
查找默认文件,如果它不存在,通过Openfiledialog向用户请求文件,如果XMLDocument为空,则打开XMLDocument+错误处理等
测试查找失败时会发生什么这听起来像是外部依赖作业tho
测试错误处理
测试XML文档为空
成功后返回test propert XML,这将隐式测试私有方法
关于这一点:
当然,我可以测试公共方法读取XML文件,但随后我必须为错误检测的每个结果制作特定的测试用例,而且在我看来,我不会正确地测试列表中的实际数据量
这才是你真正应该做的。如果您的方法有多个可能的错误结果,则应对每个错误结果进行测试。没有比这更简单的了。大多数框架使用NUnit等属性使这种多输入/输出测试非常容易
另一方面,如果您发现自己非常需要测试私有方法,这通常是一个很好的指标,表明您的类做了太多的工作,将私有方法的功能提取到外部对象可能值得考虑。您的addDateToList方法是实现细节。您想要并且应该测试的是读取xmlfile方法。您甚至已经发现了应该测试的内容:
查找默认文件,如果它不存在,通过Openfiledialog向用户请求文件,如果XMLDocument为空,则打开XMLDocument+错误处理等
测试查找失败时会发生什么这听起来像是外部依赖作业tho
测试错误处理
测试XML文档为空
成功后返回test propert XML,这将隐式测试私有方法
关于这一点:
当然,我可以测试公共方法读取XML文件,但随后我必须为错误检测的每个结果制作特定的测试用例,而且在我看来,我不会正确地测试列表中的实际数据量
这才是你真正应该做的。如果您的方法有多个可能的错误结果,则应对每个错误结果进行测试。没有比这更简单的了。大多数框架使用NUnit等属性使这种多输入/输出测试非常容易
另一方面,如果您发现自己非常需要测试私有方法,这通常是一个很好的指标,表明您的类做了太多的工作,将私有方法的功能提取到外部对象可能值得考虑。反射允许您调用私有方法,并从类外部读取或写入私有字段,但实际上写起来很冗长 在C4.0中,这个问题可以通过使用动态类型简洁地解决 如果您可以在单元测试中使用C4.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());
}
}
反射允许您调用私有方法并从类外部读取或写入私有字段,但编写起来非常繁琐 在C4.0中,这个问题可以通过使用动态类型简洁地解决 如果您可以在单元测试中使用C4.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());
}
}
你可以试试
打开汇编
yInfo.cs文件。添加此代码
[assembly: InternalsVisibleTo("Your Test Library Name")]
然后,将私有更改为内部
您可以在XmlRead类中为内部方法编写测试。您可以尝试
打开AssemblyInfo.cs文件。添加此代码
[assembly: InternalsVisibleTo("Your Test Library Name")]
然后,将私有更改为内部
您可以在XmlRead类中为您的内部方法编写测试。我不知道这个。谢谢你的信息!是的,但是记住方法必须标记为内部而不是私有。我不知道这个。谢谢你的信息!是的,但请记住,方法必须标记为内部而不是私有。您不需要测试私有方法,如果它们很复杂,则需要重新检查设计。问题是,它们不是。它们就像3-4行代码。因此,我想测试它们。他们经常接到电话。因此,由于单元测试,我打破了一些我马上就会知道的东西。你不需要测试私有方法,如果它们很复杂,那么设计需要重新审视。问题是,它们不是。它们就像3-4行代码。因此,我想测试它们。他们经常接到电话。因此,由于单元测试,我破坏了一些我将立即知道的东西。