【发布时间】:2010-12-08 09:22:22
【问题描述】:
我经常设计系统,我的系统中有一个类,它有一堆受保护的方法。受保护的方法是因为它们应该可以被专业化访问,因此,我认为受保护的方法是我的通用类和任何专业类之间的契约。
因此,我想测试这些方法的行为是否正确,因此我的单元测试将需要访问受保护的方法,这在 c# 中是不可能的,除非使用像反射这样的脏黑客。
我通常选择的解决方案是在我的单元测试中创建一个专门的类,将这些受保护的方法公开。因为我总是将单元测试保存在单独的程序集中,所以系统代码本身无法访问这些类,并且在我的系统代码中,受保护的函数仍然受到保护。
// In the system code assembly
namespace MySystem {
public class SomeClass {
protected void DoSomething() {
...
}
}
}
// In the unit test assembly
namespace MySystem.Unittests {
public class SomeClass2 : SomeClass {
public new void DoSomething() {
base.DoSomething();
}
}
}
我的单元测试现在能够通过实例化专用类来测试父类上受保护成员的行为。
我还进一步使用它来模拟对象并模拟对受保护的虚拟函数的函数调用,但该代码有点复杂,所以我将把它删掉。
我发现完成这项任务的这种方式非常简单,以至于我不可能是唯一这样做的人,所以我认为必须有一个通用的命名约定?
【问题讨论】:
-
我只使用接口并在测试时不理会私有方法。如果您遵循 SRP,它们不应该是太多。
-
我会将 SomeClass2 重命名为 TestableSomeClass。这阐明了原因和内容。 (而且,是的,我们在这里经常使用这种模式......)
-
@Arjan - 我的问题之一是弄清楚如何调用 SomClass2 ;)
标签: c# unit-testing tdd naming-conventions design-patterns