2015-09-04 87 views
1

看來,下面的代碼不表現爲我所期望的問題:FakeItEasy - 用new修飾符

using FakeItEasy; 
using Microsoft.VisualStudio.TestTools.UnitTesting; 

[TestClass] 
public class UnitTest1 
{ 
    [TestMethod] 
    public void TestMethod1() 
    { 
     var derived = A.Fake<IDerived>(); 
     A.CallTo(() => derived.Dependency).Returns(null); 

     IBase baseObj = derived; 
     Assert.IsNull(baseObj.Dependency); //Fails 
    } 
} 

public interface IDerived : IBase 
{ 
    new IDependency Dependency { get; } 
} 

public interface IBase 
{ 
    IDependency Dependency { get; } 
} 

public interface IDependency 
{ 
} 

而不是返回空,假的很容易返回IDependency假的實例。也許通過設計?無論如何,我將如何解決這個問題,並確保baseObj.Dependency返回配置?

+0

請注意,這個問題已經作爲GitHub問題533再次提出,[僞造包含帶有新修飾符的屬性的接口並轉換爲基接口將會轉移結果](https://github.com/FakeItEasy/FakeItEasy/issues/ 533)。 我希望現在大多數討論都在那裏進行。 –

+0

好的,我當時在github上發佈它的要點是提交一個bug。儘管現在看來這是一項功能要求。 –

回答

4

這是正常行爲。 IDerived現在有兩個成員。一個從IBase繼承,另一個在IDerived中定義。

在您的測試方法中,您正在使用FakeItEasy來設置IDerived中的值。

IBase的成員沒有設置。所以它得到了FakeItEasy給它的缺省值,這是一個嘲弄的IDependency。

如果你想設置它,使用下面的代碼:

IDerived derived = A.Fake<IDerived>(); 

IBase baseObj = derived; 

A.CallTo(() => baseObj.Dependency).Returns(null); 

Assert.IsNull(baseObj.Dependency); //No error here 

在這段代碼中,我們設置IDerived經的其他成員,這是在基本接口中定義的依賴。

+0

我有點分裂。一方面,我想,「它應該模仿[此代碼](http://pastebin.com/qzRwC5NW)」。另一方面,也許FakeItEasy應該保持其靈活性。 –

+0

在您引用的代碼中的派生類中,您有一個自動屬性。此屬性的setter **不是任何接口的組成部分**。在引擎蓋下,二傳手將存儲在一些隱藏的領域的價值。然而,這個屬性的getter實際上是實現了兩個接口屬性,IBase.Dependency和IDerived.Dependency。所以,當你的消費者代碼調用任何這些屬性獲取器時,它們將由隱藏字段中讀取的相同實現獲取器提供服務。 –

+0

我不知道爲什麼提到它是一個自動屬性很重要,因爲具有後臺字段的屬性的行爲是相同的。事實上,對於具體的實施,參考是相同的,無論其類型如何。如果一個派生類實現了50個具有同名屬性的接口,那麼對其中的任何一個進行轉換並訪問該屬性都會導致該屬性的vtable條目相同,對不對?就我而言,「FakeItEasy」並不模仿這種行爲。除了不理解爲什麼我認爲它會導致一些問題。 –