Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 单元测试私有方法_C#_Unit Testing - Fatal编程技术网

C# 单元测试私有方法

C# 单元测试私有方法,c#,unit-testing,C#,Unit Testing,首先,我知道关于这个话题有很多问题。我读过其中的大部分,但我真的不知道这是因为缺乏正确的面向对象编程,还是我遗漏了什么 所以我有一个xmlRead类,它将XML文件读入一些列表。我想对这个类进行单元测试。我认为最简单的方法是测试addDataToList。但这是一种私人方法。所以我想知道是应该将其公开,还是测试公共方法ReadTheXmlFile public class xmlRead { List<string> ... // A couple of lists tha

首先,我知道关于这个话题有很多问题。我读过其中的大部分,但我真的不知道这是因为缺乏正确的面向对象编程,还是我遗漏了什么

所以我有一个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非常小,但很容易进行单元测试。但我也觉得这不应该是一种公开的方法。当然,我可以测试公共方法读取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行代码。因此,我想测试它们。他们经常接到电话。因此,由于单元测试,我破坏了一些我将立即知道的东西。