我正在使用TDD开展我的第一个项目,但在继承方面遇到了困难。
例如,如果我有如下代码:
public interface IComponent
{
void MethodA();
void MethodB();
}
public class Component : IComponent
{
public virtual void MethodA()
{
// Do something
}
public virtual void MethodB()
{
// Do something
}
}
public class ExtendedComponent : Component
{
public override void MethodA()
{
base.MethodA();
// Do something else
}
}
如果我不依赖于 Component,那么我就无法单独测试 ExtendedComponent。
然而,如果我使用组合来创建 ExtendedComponent,就像这样
public class ExtendedComponent : IComponent
{
private readonly IComponent _component;
public ComponentB(IComponent component)
{
_component = component;
}
public virtual void MethodA()
{
_component.MethodA();
// Do something else
}
public virtual void MethodB()
{
_component.MethodB();
}
}
我现在可以通过模拟包装的IComponent来单独测试ExtendedComponent。
这种方法的缺点是,如果我想添加新的方法到IComponent,则必须将新方法添加到Component、ExtendedComponent和任何其他实现中。使用继承,我只需将新方法添加到基础组件中,而不会破坏其他任何内容。
我真的希望能够进行清晰的测试,所以我更倾向于使用组合路线,但我担心仅仅为了进行单元测试而始终使用组合并不是一个有效的理由。此外,在基本层面上添加功能将需要创建大量繁琐的委托方法。
我非常希望得到一些关于其他人如何解决这类问题的建议。