你在哪里为私人方法进行单元测试?

时间:2010-01-09 17:48:33

标签: c# unit-testing tdd encapsulation information-hiding

在C#类中将私有函数的单元测试放在哪里?

article in Wikipedia建议:

  • 将测试与他们正在测试的成员放在同一个班级
  • 使用部分类

就个人而言,这些方法似乎都不恰当,我更喜欢将单元测试放在一个单独的项目中。

对此有何想法?

(我知道关于是否应该对私人方法进行测试存在相当多的争论。我希望听到争论的双方。)

8 个答案:

答案 0 :(得分:14)

私人方法不一定需要直接测试。您可以根据使用这些私有方法的公共方法的测试来确定其有效性。

但是,您应该注意确保您的公共方法可以轻松地将模拟依赖项注入您的私有方法,以便于测试和模拟所有合理的场景。

编辑:至于您应该找到其他测试的位置,我建议您在项目中使用一个单独的子目录来处理测试。在为PHP应用程序编写测试时,我在项目的根目录中有一个 tests 目录,其目录结构与我的实际应用程序目录结构的目录结构相同。在其中,我为每个真正的班级设置了一个测试课程。

在发布到生产环境时,不要使用项目的其余部分编译测试类(或者在PHP等解释语言的情况下,不要将测试类部署到生产Web服务器)。

答案 1 :(得分:9)

不要对私有方法进行单元测试。单元测试用于测试类的可见(所以公共和受保护)接口。私有方法是实现细节,并且对它们进行单元测试是不必要的(它们的行为应该通过可见方法的测试进行隐式测试),导致脆弱的测试(因为实现细节可能会改变)并且是重构的障碍。 / p>

如果你有一个私有方法,你觉得你需要进行单元测试,那么这是一个很大的提示,也许它应该被考虑到另一个类的公共方法中。

  

在C#类中将私有函数的单元测试放在哪里?

无处。它们不存在。

一般来说,我的单元测试是在单独的项目中。

答案 2 :(得分:9)

我个人也喜欢在单独的项目中进行单元测试。 如果要对私有方法进行单元测试,则可以将私有方法设为内部方法。然后,您可以通过将以下内容添加到AssemblyInfo.cs来使单元测试可以看到内部方法直接调用:

[assembly: InternalsVisibleTo("MyAssembly.UnitTests")]

答案 3 :(得分:3)

你应该做对你有用的事情;这对我有用:

我的单元是一个类:这就是我要测试的内容。不是一种方法。我正在尝试进行面向对象的编程,因此我将注意力放在了对象上。

如果我发现自己想要测试私有方法,我需要重构。我只想直接测试私有方法,因为它和测试之间有太多其他代码,并且因为私有方法本身很复杂,需要测试注意力。所以,我通常会提取类来将该私有方法和其他相关成员拉入一个新类。

我的课程往往非常。它们易于阅读和理解。当然,我的方法也非常小而且易于理解。

转换到这种工作方式需要我重新思考我对编程的许多假设和习惯。曾经看似激进的东西现在似乎司空见惯。

答案 4 :(得分:2)

我同意通常不应测试私有方法,因为您应该只测试公共接口。

话虽如此,您可能有理由想要测试私有方法:

  1. 您正在使用TDD,您必须开发一个复杂的私有方法。为私有方法创建测试方法可能是必要的,以保持您的写测试代码 - 测试周期的正确粒度。

  2. 您可能是其他人可能需要修改私有方法的团队成员,并且您希望测试以确保更改不会产生问题。

  3. 一些解决方案:

    1. 声明一些公共的方法,这些方法委托给私有方法,仅用于测试目的。这些可以是例如前缀的。使用TestFoo1,TestFoo2等

    2. 使用内部

    3. http://msdn.microsoft.com/en-us/library/7c5ka91b(VS.80).aspx

答案 5 :(得分:1)

您的问题标题和第一句话有所不同。 :)

我不确定在哪里放置测试。这取决于语言,C#不是我熟悉的东西,但我想你的代码的很大一部分都在私有方法中。如果没有经过测试,我会感到不舒服。代码覆盖率会下降很多。

答案 6 :(得分:1)

绝对是的。无论如何应该测试私有方法。和mbunit单元测试框架可以访问私有成员。

看到这个博客: testing private methods

答案 7 :(得分:1)

我们在Visual Studio中使用私有访问器来测试私有方法。这意味着测试类可以存在于单独的项目中。

但是,我们试图真正限制这些数量,因为:

  • 可以单独使用的私有方法可以作为另一个类中的公共方法拉出来
  • 在类之外没有做任何特别有用的私有方法可以通过该类的公共方法进行测试
相关问题