2010-01-09 63 views
4

你在哪里把私人函数的单元测试放在C#类中?你在哪里把私人方法的单元测试?

article in Wikipedia提示:

  • 把测试在同一个班,他们正在测试
  • 使用部分类

个人成员,这些方法都似乎是适当的,和我更愿意将单元测试放在一个单独的项目中。

对此有何看法?

(我知道有关于是否私有方法应该在所有被测试的辩论相当数量的。我想听到争论的双方。)

+1

我认为把测试代码放在生产代码中是一个坏主意。 – Benny 2010-01-09 18:25:38

+0

您使用哪种测试框架(如果有)? – 2010-01-09 21:38:28

回答

14

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

然而,你应该小心,以确保您的公共方法可以轻松地将模拟依赖到你的私有方法,以方便测试和模拟所有合理的方案。

编辑:至于你的其他测试应该在哪里,我建议在你的项目中的一个单独的子目录来处理你的测试。在为PHP应用程序编写测试时,我的项目根目录中有测试目录,其目录结构与我的真实应用程序目录结构相同。其中,我为每个真实课堂都有一门测试课。

只是不释放到生产时你的项目的其余部分编译你的测试类(或类似PHP的语言interpretted的情况下,不部署测试类生产Web服务器)。

+2

+1表示很好。 :) – 2010-01-09 17:54:04

+0

那么你是说私人函数中的代码应该没有任何依赖,这些依赖没有被该类的构造函数或公共方法接收到参数中? – Jonathan 2010-01-09 17:55:47

+0

同意使注入依赖,能够替换任何依赖简化了测试。通过构造函数或属性接收它们是标准的,适合容器。当它只是出于可测试性目的时,您还可以考虑使用内部方法或属性。 – Mathias 2010-01-09 18:14:46

1

您的问题标题和第一句是不同的。 :)

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

+0

对此感到抱歉,我编辑了标题。 – Jonathan 2010-01-10 03:43:51

9

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

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

你在哪里把私人函数在C#类的单元测试?

无处。他们不存在。

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

+4

这指出了测试的目的:测试说“你的对象工作正常”,它是:“你的对象的公共接口工作正常”。如果事实上你的私有方法的原因是公共方法,那么它们必须只存在于为公共方法实现某些东西。所以如果你测试公共方法,你正在测试私有方法。测试驱动开发说:如果你想做一些事情写下测试,然后执行它。这样你只需要编程公众就可以了。私人方法将遵循相同的政策。 – helios 2010-01-09 18:01:05

+0

是只有一个构造函数和私有方法没有用于单元测试的类? – 2010-03-25 14:08:29

+0

感觉“我需要测试这个私有方法”可能表明代码需要重构,私有方法中的功能应该移到其他类中,并以公共方法公开。 – 2013-06-18 08:21:50

1

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

然而,我们尽量要真正限制这些,因为数字:

  • ,可以独立的私有方法可以在其他类中拉出的公共方法
  • 私人没有方法做任何特别有用的课外活动都可以通过该课程的公开方法进行测试。
9

我也个人喜欢在单独的项目中进行单元测试。 如果你想单元测试一个私有方法,你可以改为私有方法。然后,您可以看到内部方法,你的单元测试通过直接添加以下到AssemblyInfo.cs中呼吁:

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

+1,但我认为最好只测试公共I/F。 – kenny 2010-01-09 18:40:59

2

我同意私有方法不应该被测试,一般来说,因为你应该只测试公共接口。

话虽这么说,是有原因的,你可能想测试私有方法:

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

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

一些解决方案:

  1. 声明一些方法,这些方法公众代表对私有方法和只用于测试目的。这些可以作为例如前缀。与TestFoo1,TestFoo2等

  2. 使用内部

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

3

你应该为你做什么工作;这里是什么适合我:

我的单位是一类:这就是我想要测试。不是一种方法。我试图做面向对象编程,所以我把注意力放在对象上。

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

我的班级倾向于相当。他们很容易阅读和理解。当然,我的方法也很小,很容易理解。

转换到这种工作方式需要我重新思考许多关于编程的假设和习惯。曾经看起来很激进的现在看来很平常。

+0

+1,如果您想要测试私有方法,您(可能)需要重构。 – 2010-01-09 18:24:32