2011-03-02 54 views
2

我有問題嘲諷的一套接口:有嘲諷接口的「新」成員起訂量

interface IFoo 
{ 
    object Blah { get; } 
} 

interface IBar : IFoo 
{ 
    new string Blah { get; } 
} 

我嘗試作爲嘲諷:

var mock = new Mock<IFoo>(); 
mock.SetupGet(m => m.Blah).Returns("Blah"); 

這現在工作:

Assert.That(mock.Object.Blah, Is.EqualTo("Blah")); 

問題是,當我添加以下內容時,爲IBar接口也有一個值,值爲IFoo.Blah是空的。

var bar = mock.As<IBar>(); 
bar.SetupGet(m => m.Blah).Returns("Blah"); 

這現在工作:

Assert.That(((IBar)mock.Object).Blah, Is.EqualTo("Blah")); 

但舊的失敗:

Assert.That(mock.Object.Blah, Is.EqualTo("Blah")); 
// mock.Object.Blah is null now 

有沒有辦法讓這兩個工作?

回答

1

隨着MOQ(v4.0.10827)和.Net 4,該代碼工作:

var mock = new Mock<IFoo>(); 
var bar = mock.As<IBar>(); 
mock.SetupGet(m => m.Blah).Returns("Blah"); 
Assert.That(mock.Object.Blah, Is.EqualTo("Blah")); 
bar.SetupGet(m => m.Blah).Returns("BlahBlah"); 
Assert.That(((IBar)mock.Object).Blah, Is.EqualTo("BlahBlah")); 
Assert.That(mock.Object.Blah, Is.EqualTo("Blah")); 

必須初始化設置你的財產在你的界面。

+0

似乎將'mock.As '調高 – 2011-03-02 17:15:44

0

我認爲你需要使用「覆蓋」而不是「新」。當你使用「新」時,你實際上正在製作第二個功能。這裏的DOC:http://msdn.microsoft.com/en-us/library/ms173153.aspx

+0

除非附加功能的目的是,在這種情況下,你需要找到一種方式,當您使用伊巴爾嘲笑兩種功能。 – 2011-03-02 16:22:19

+0

我不能使用替代,因爲其中的一個接口,'IFoo'在這種情況下,是不是我的。我需要嘲笑這兩個函數,但嘲笑第二個函數會清除第一個函數的模擬。 – 2011-03-02 16:23:37