是否可以使用Moq來模擬實現接口和抽象類的對象?你可以模擬一個實現接口和抽象類的對象嗎?
即:
public class MyClass: SomeAbstractClass, IMyClass
你能嘲笑嗎?
是否可以使用Moq來模擬實現接口和抽象類的對象?你可以模擬一個實現接口和抽象類的對象嗎?
即:
public class MyClass: SomeAbstractClass, IMyClass
你能嘲笑嗎?
你可以模擬任何接口,以及任何抽象或虛擬成員。基本上就是這樣。
這意味着,以下是絕對有可能的:
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
)。
你的問題沒有意義。 Moq可以用來模擬抽象類和接口。由於MyClass
既不是那麼你不能創建它的模擬。 雖然我不認爲這是個問題,因爲MyClass實例的消費者可能會期待SomeAbstractClass
或IMyClass
實例而不是MyClass
實例。如果他們確實期望得到一個MyClass
實例,那麼您需要在其上進行一些抽象。這可以通過使SomeAbstractClass
實現IMyClass
接口或通過使IMyClass
接口暴露SomeAbstractClass
的方法和屬性來實現。
我認爲他的問題確實有道理,他所問的可能是在他的問題 – 2009-12-28 14:29:01
中嘲笑* equivalent * MyClass對象否,因爲在這種情況下,正確的問題應該是:我可以使用Moq來模擬任何具體的類?答案根本不是。據我所知,Rhino mock可以做到這一點。 – 2009-12-29 08:35:17