我正在使用 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
}
}
那么我不能单独测试 ExtendedComponent,因为它依赖于 Component。
但是,如果我像这样使用合成来创建 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 以及可能有很多的任何其他实现。使用继承我可以将新方法添加到基本组件中,它不会破坏其他任何东西。
我真的希望能够干净地进行测试,所以我更喜欢组合路线,但我担心能够进行单元测试并不是总是使用组合而不是继承的正当理由。此外,在基础级别添加功能将需要创建许多繁琐的委托方法。
我真的很感谢其他人如何解决这类问题的一些建议