2009-12-28 78 views

回答

5

你可以模擬任何接口,以及任何抽象或虛擬成員。基本上就是這樣。

這意味着,以下是絕對有可能的:

var imock = new Mock<IMyClass>(); 
var aMock = new Mock<SomeAbstractClass>(); 

如果成員SomeAbstractClass繼承是不是密封的,你也可以模擬MyClass的:

var mcMock = new Mock<MyClass>(); 

這是否有道理,還是沒有取決於MyClass的實現。比方說,SomeAbstractClass這樣定義:

public abstract class SomeAbstractClass 
{ 
    public abstract string GetStuff(); 
} 

如果MyClass中的GetStuff方法是這樣實現的,你仍然可以覆蓋它:

public override string GetStuff() 
{ 
    return "Foo"; 
} 

這將使你寫:

mcMock.Setup(x => x.GetStuff()).Returns("Bar"); 

因爲除非明確密封,GetStuff仍然是虛擬的。然而,你是否寫過這樣的GetStuff:

public override sealed string GetStuff() 
{ 
    return "Baz"; 
} 

你將無法嘲笑它。在這種情況下,你會從Moq得到一個異常,說明它是非虛擬成員的無效覆蓋(因爲它現在是sealed)。

0

你的問題沒有意義。 Moq可以用來模擬抽象類和接口。由於MyClass既不是那麼你不能創建它的模擬。 雖然我不認爲這是個問題,因爲MyClass實例的消費者可能會期待SomeAbstractClassIMyClass實例而不是MyClass實例。如果他們確實期望得到一個MyClass實例,那麼您需要在其上進行一些抽象。這可以通過使SomeAbstractClass實現IMyClass接口或通過使IMyClass接口暴露SomeAbstractClass的方法和屬性來實現。

+1

我認爲他的問題確實有道理,他所問的可能是在他的問題 – 2009-12-28 14:29:01

+0

中嘲笑* equivalent * MyClass對象否,因爲在這種情況下,正確的問題應該是:我可以使用Moq來模擬任何具體的類?答案根本不是。據我所知,Rhino mock可以做到這一點。 – 2009-12-29 08:35:17

相關問題