繁体   English   中英

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

[英]Should protected methods be unit-tested? How to avoid repetitive testing?

使用C#

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

我尚未看到的一个问题是必须重复测试在继承的类中调用受保护方法的公共方法。 如果我在基类中测试了受保护的方法,那么肯定不必在基类中重新测试它。 还是应该将测试复制并粘贴到多个类?

您绝对应该测试受保护的方法。 从测试的角度来看,即使“公共”仅限于从您的类派生的类,“受保护”方法仍是公共接口的一部分。 由于您无法控制的代码可以引用这些方法,因此必须确保它们按定义运行。

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

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

public class B:A
{

}

问题是您是否为B.Foo编写测试。 一方面,我会说不,因为B没有提供Foo的显式实现,因此它的行为与A.Foo的行为不可能不同,我们可以假设您已经测试过A.Foo

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

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

综上所述,这与为任何派生自另一个类的代码编写测试没有什么不同。 考虑从TextWriter派生一个类。 您是否会为TextWriter类定义的所有虚函数编写显式的单元测试? 还是只为覆盖的那些方法以及其功能可能已经改变的那些方法编写测试?

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

尽管在现实世界中,通常通常首先要编写代码然后再进行测试。 但是,仍应针对所有访问级别编写它们。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM