2011-12-20 17 views
3

私はこのクラスを持っている:クラスを拡張してインターフェイスを実装するオブジェクトを模擬する方法は?

public class BaseFoo 
{ 
    public bool BoolProp { get; set; } 
} 

public interface IFoo { 
    void Method(); 
} 

public class FooClass : BaseFoo, IFoo 
{ 
    public void Method() 
    { 
     // DoSomething 
    } 
} 

public class MyClass 
{ 
    IFoo foo; // 
    public MyClass(IFoo foo) 
    { 
     this.foo = foo; 
    } 

    public void DoSomething() 
    { 
     if (((FooClass)foo).BoolProp) 
     { 
      // yeah 
     } 
     else 
     { 
      //bad 
     } 
    } 
} 

私のシナリオは次のとおりです。

void main() 
    { 
     MyClass obj = new MyClass(new FooClass()); 
     obj.DoSomething(); 
    } 

私は必要なので、私は私があまりにもBaseFooクラスをモックすることを可能にするIFooインターフェイスのモックオブジェクトを作成したいのですがMyClass.DoSomething()メソッドのif(((FooClass)foo).BoolProp)の "else"ブランチを常に実行するのを避けるためです。
これで、MyClassで使用されるBaseFoo.BoolPropの動作を模擬することができるモックオブジェクトを作成するにはどうすればよいですか(これはIFooのモックオブジェクトを取ります)?
は、私がどんな結果なし「BoolPropは」仮想ではないのでことを行なったし、それは.NET Frameworkのクラスの一部であるように私はそれを変更することはできません。

var cMock = new Mock<BaseFoo>(); 
    var iMock = cMock.As<IFoo>(); 

    cMock.Setup(c => c.BaseProp).Returns(true); 
    MyClass myClass = new MyClass(iMock.Object); 
+2

が、これは動作しません喜んでいる - これはあなたのクラス設計のコードのにおいです:この場合、それはおそらく、あなたはその後、依存性やモックとして使用できる統一インターフェースを導入しているベストですあなたがすべきタイプ 'IFoo'の' BaseFoo'への依存関係をキャストしないでください。あなたは私が考えることができる方法でこれを行うには、Liskov置換原則とその悪い選択に違反しています。 – BrokenGlass

+0

私はこの質問に-1をするように誘惑されています... – vaitrafra

答えて

0

方法(BaseFooFoo抽象クラスを宣言するでしょうか? )は、BaseFooから派生し、IFooを実装しています。次に、moqにBaseFooFooを表示することができます。あなたのデザインが本当に言っている何

5

は、あなたのクラスMyClassIFoo上の依存関係を持っていない、それはBaseFooIFooを実装から派生したクラスのインスタンスに依存しているということです。

interface IFooBar 
{ 
    bool BoolProp { get; set; } 
    void Method(); 
} 
関連する問題