2011-12-20 74 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(); 
    } 

我想創建爲IFoo的接口,允許我嘲笑BaseFoo課呢,因爲我需要一個模擬對象總是避免運行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 2011-12-20 10:08:34

+0

我很想去這個問題上-1 – vaitrafra 2012-04-10 15:50:56

回答

0

如何聲明一個抽象類(BaseFooFoo? )從BaseFoo派生並實現IFoo。然後你可以顯示BaseFooFoo到moq。

5

你的設計是真正的意思是,你的MyClass類沒有對IFoo的依賴,它從BaseFoo實施IFoo派生的類實例上的依賴。在這種情況下,它可能是你介紹一個統一的接口,然後你可以作爲依賴和模擬使用最好:

interface IFooBar 
{ 
    bool BoolProp { get; set; } 
    void Method(); 
}