受保护的方法应该进行单元测试吗?如何避免重复测试?

时间:2014-10-23 12:41:28

标签: c# unit-testing

使用C#

我知道之前已经问过这个问题,很多人会回答不,只测试公共方法,而不是实现细节。其他人会说是,如果它有一些重要的逻辑。虽然您可能会考虑将其分解为自己的类。

我无法解决的一个问题是必须重复测试在继承类中调用受保护方法的公共方法。 如果我在基类中测试受保护的方法,我肯定不必在基类中重新测试它。或者我应该将测试复制并粘贴到多个类?

2 个答案:

答案 0 :(得分:4)

你绝对应该测试受保护的方法。从测试的角度来看,一个受保护的"方法仍然是公共界面的一部分,即使公共"公共"仅限于从您的班级派生的那些课程。因为您不能控制的代码可以引用这些方法,所以必须确保它们按照定义运行。

至于重复测试,我没有明确的答案。如果给出:

public class A
{
    protected virtual void Foo() {}
}

public class B:A
{

}

问题是你是否为B.Foo编写了一个测试。一方面我会说不,因为B没有提供Foo的明确实现,因此其行为可能与{{1}的行为不同我们可以假设您已经测试过A.Foo

另一方面,A.Foo可能依赖于A.Foo可能修改的其他protected字段或属性,或B在构造函数中提供的私有回调或初始化功能。在这种情况下,您绝对必须测试B,因为其行为可能B.Foo不同,即使A.Foo没有覆盖{{1} }}

显然,如果B覆盖A.Foo,那么您必须为B编写测试。但如果Foo没有覆盖B.Foo,那么你必须使用你的判断。

所有这一切,与为其他任何来自其他类的类别编写测试完全没有什么不同。考虑从TextWriter派生一个班级。您是否会为B类定义的所有虚函数编写显式单元测试?或者,您是否只为那些覆盖的方法编写测试,以及那些功能可能因副作用而改变的方法?

答案 1 :(得分:0)

关于什么应该是单元测试以及什么不应该是什么,有很多意见。 我个人认为,对于您编写的每个函数,您应首先编写单元测试以指定所需的行为。然后编写代码以使此测试通过。这适用于私人,公共,受保护和内部。 如果使用它应该进行单元测试。 相信我,从长远来看,这会让您的生活变得更轻松,因为如果您或其他开发人员更改现有的单元测试代码,那么行为的变化就更容易被捕获。

在现实世界中,虽然它通常最终成为代码然后测试。但是,仍应为所有访问级别编写它们。

相关问题