2012-09-06 76 views
1

这种共识似乎不是在TDD时测试私有方法。TDD重复声明

Should Private/Protected methods be under unit test?

我不停的按这个相同的情况。我有一个私有方法(例如它将所有选项切换为关闭)。它改变了很多状态,并被一些公共方法调用。无论调用哪些公用方法(所有选项都设置为off),私有方法对状态所做的更改将保持不变。

什么是最好的方式来测试这个私有方法的功能,而无需添加许多有效地做同样事情的测试?

btw,我正在使用QUnit来测试Javascript对象。

这是我的课程的过于简化的版本。

http://jsfiddle.net/twistedinferno/UMgAx/

编辑

什么我真的想在这里问是不是“我不应该或者我应该测试私有方法”作为已经回答这个问题的答案是否定的。我想知道如何最好地测试每个公共方法,因为使用我的私有方法会导致许多断言相同。相同的私有方法被许多公共方法调用。可以有很多重复的断言来测试当许多公共方法中的每一个调用我的私有方法时发生的状态变化吗?

新拨弄测试 http://jsfiddle.net/twistedinferno/JHzWh/

回答

4

测试的公共方法。

或者更一般地说,测试物体的向外可见界面。

如果公用方法使用私有方法,则将使用它的使用作为结果。但私有方法本身不属于该对象之外的其他任何东西,包括测试。

这些测试不应该知道或关心这样的私有方法是否存在,更不用说他们是否正在测试它。他们应该测试所有的公共功能。

如果许多测试都在做同样的事情,那么这可能表明公共功能中有不必要的重叠?也许有重新考虑的空间吗?当然,这完全是猜测而没有看到任何代码。你能提供一个例子吗?

编辑

附加断言重复相同的按键,但测试是完全不同的,因为它们正在测试不同的朝外的功能。您始终可以将重复的断言重构为每个测试调用的单个函数。自定义聚合断言的排序。只要公共方法继续具有相同的可观察(可测试)行为,那就没有问题。一旦发生变化,其测试当然也需要改变。

+0

这里是一个过于简化的小提琴http://jsfiddle.net/twistedinferno/UMgAx/我的真实事例证明过大增加或过于复杂凝结。公共功能肯定存在重叠,但我不确定该怎么做。 – orangesherbert

+0

@TwistedInferno:在这个例子中,它看起来像你打算测试的是后面三个函数,而第一个函数是私有函数? (诚​​然,我不熟悉JavaScript对象。)对于外部观察者来说,私有函数甚至存在并不重要。三个公众测试。他们都在内部使用相同的私人功能这一事实对测试并不重要。 (事实上​​,该测试也可以有一个共享的私有函数来验证普遍预期的业绩。) – David

+0

烨,用下划线的方式是私人的,那些没有是公共的(只是一个约定,另一个选项是关闭其效率较低在内存方面)。所有的灯都是公开的。好的,所以我应该为每个公共方法的每个亮度值包含四个断言? (即4 x 3断言)对我来说是重复测试,感觉不太对。 – orangesherbert

2

既然你正在练习TDD中,我推测,在有问题的私有方法的每一行代码就不会在缺乏所需它被写入测试的存在。这意味着不需要独立于公共接口来测试私人功能。

谢谢!

布兰登

+0

非常感谢您的意见,但我不确定是否遵循。即使没有专门的测试测试,私有方法也会存在。拥有私有方法的原因是封装类似的行为并删除重复的代码。我同意,我不需要独立测试私有方法,但是我的问题是每个公共方法在每个测试中都有许多完全相同的断言,并且由于我多次重复断言,所以感觉不太正确。 – orangesherbert

1

我同意bcariso和大卫。你不应该测试,也不应该测试私有方法。

有一点需要注意的是,如果你的私有方法是如此大,重要的是,你觉得你必须测试它,你应该考虑提取它是它自己的助手类的公共方法。

在Javascript中,同样的原则站立,只有你会使其公开可见的功能或模块(如果您使用的模式)。

+0

谢谢阿萨夫,这不是说我的私人方法如此之大,它只是重复行为,因此我需要重复测试。 – orangesherbert

+0

在这种情况下,我认为这是一个明确的信号,您应该将它作为一个完全公共的函数,因为它被重用。 –

+0

谢谢阿萨夫。它只重复班级内部的行为,所以我不确定是否公开会是一个好主意;私人方法不需要公开。也许你可以尽管细说...... – orangesherbert