c# - protected 方法应该进行单元测试吗?如何避免重复测试?

标签 c# unit-testing

使用 C#

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

我还没有看到解决的一个问题是必须重复测试在继承类中调用 protected 方法的公共(public)方法。 如果我在基类中测试 protected 方法,当然我不必在基类中重新测试它。或者我应该将测试复制并粘贴到多个类(class)吗?

最佳答案

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

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

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

public class B:A
{

}

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

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

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

总而言之,这与必须为派生自另一个类的任何类编写测试并没有什么不同。考虑从 TextWriter 派生一个类.您会为 TextWriter 类定义的所有虚函数编写显式单元测试吗?或者您是否只为您重写的那些方法以及那些功能可能因副作用而改变的方法编写测试?

关于c# - protected 方法应该进行单元测试吗?如何避免重复测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26528348/

相关文章:

c# - 如何在设计模式下调试 WPF 用户控件?

java - JUnit 测试(正向和负向测试)

javascript - should.js 不会导致 mocha 测试失败

C# decimal.Parse 行为

c# - 自定义附加事件的处理程序

c++ - 使用 CMake 生成的系统在构建时运行 Google 测试

python - 单元测试 : How can i import test classes dynamically and run?

c# - 在单元测试之间恢复数据库: Database is still in use

c# - 在单独的帮助程序类中访问 Controller 外部的 HttpContext session 的最佳实践

c# - 通过基于样式属性覆盖样式