我正在使用TDD開展我的第一個項目,並且在繼承方面遇到了一些磚牆問題。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因爲它依賴於組件。
然而,如果使用組合物來創建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以及任何其他可能有很多實現的實現中。使用繼承我可以只添加新的方法到基礎組件,它不會破壞別的東西。
我真的希望能夠進行乾淨的測試,所以我偏愛構圖路線,但我擔心能夠進行單元測試並不是總是使用構圖而不是繼承的合理原因。在基本級別添加功能還需要創建許多乏味的委託方法。
我會很感激的人是如何接洽其他此類問題的一些建議
我想,你誤解了一點'孤立'測試的概念。這意味着,您測試或組件不依賴於外部組件。但是,在繼承的情況下,基類不在您的範圍之外。它實際上是你的一部分。 – undefined