繁体   English   中英

单元测试专用方法

[英]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,请查看本文:

使用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为空等)。

  • 测试查找失败时会发生什么(听起来像外部依赖作业)
  • 测试错误处理
  • 测试XML文档为空
  • 成功返回测试属性XML(这将隐式测试私有方法)

关于此:

我当然可以测试公共方法ReadTheXmlFile(),但是随后我必须针对错误检测的每个结果制作特定的测试用例,并且我认为我不会适当地测试列表中的实际数据摄入量。

那确实是你应该做的。 如果您的方法有多个可能的错误结果,则应对每个结果进行测试。 没有比这更简单的了。 大多数框架都使用NUnit的TestCase等属性使此操作(多次输入/输出测试)非常容易。

在旁注中,如果您发现自己非常需要测试私有方法,则通常可以很好地表明您的类正在做过多的事情,并且可能需要考虑将私有方法的功能提取到外部对象。

你可以试试,

打开AssemblyInfo.cs文件。 添加此代码,

[assembly: InternalsVisibleTo("Your Test Library Name")]

然后,将专用-更改为-内部

您可以在XmlRead类中为内部方法编写测试。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM