单元测试私有方法

本文关键字:有方法 单元测试 | 更新日期: 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类中为内部方法编写测试。