2014-04-09 63 views
6

我試圖寫一個單元測試,涵蓋以下行淨假貨 - 當基類是抽象如何墊片繼承的財產?

var fileFullName = fileInfo.FullName; 

其中的fileInfo是FileInfo的實例。

我使用假貨勻場處理FileInfo對象,但我無法提供FullName屬性的值,因爲它是從基類繼承。

name屬性,這是不能繼承的,我可以簡單地這樣做:

ShimFileInfo.AllInstances.NameGet = info => OriginalFullName; 

由微軟提供的答案是建立在基類中的墊片,在這種情況下FileSystemInfo。但是,如果我試試這個:

ShimFileSystemInfo.AllInstances.FullNameGet = info => OriginalFullName; 

它不工作,因爲FileSystemInfo是不能創建一個抽象類,因此不能勻。

在這種特殊情況下,我可以解決這個問題,因爲我可以將DirectoryName和Name屬性組合起來使其成爲可測試的,但看起來很瘋狂,我不能只使用我想要的屬性,因爲它恰好來自基礎。

有沒有人翻過這個問題,並設法解決它?

+0

嗯,我還沒有遇到這個問題,但使用反射怎麼樣? –

+0

爲什麼不創建一個測試文件嗎?測試文件可以做什麼時,您想使用假貨有沒有什麼特別的原因? – gfish3000

+0

考慮你真的想考什麼,如果你不使用的測試文件,那麼什麼是真正的測試嗎?看起來你正朝着一個方向前進,你將要測試的只是你的假貨。 – Zache

回答

5

你說墊補基類沒有工作,但我恰恰如此,它在我們的測試工作。

FileInfo在System.dll中定義爲FileInfo : FileSystemInfo,並且FileSystemInfo位於mscorlib中。許多類型的mscorlib默認情況下不墊高,但如果您添加到您的mscorlib.fakes文件:

<Fakes xmlns="http://schemas.microsoft.com/fakes/2011/"> 
    <Assembly Name="mscorlib" Version="4.0.0.0"/> 
    <ShimGeneration> 
    <Add FullName="System.IO.FileSystemInfo"/> 
    </ShimGeneration> 
</Fakes> 

,然後建立你的測試項目,你得到一個ShimFileSystemInfoFileSystemInfo從mscorlib程序,還有ShimFileInfo爲來自System.dll的FileInfo。然後這個工程:

using (ShimsContext.Create()) 
{ 
    var directoryName = "<testPath>"; 
    var fileName = "test.txt"; 
    ShimFileSystemInfo.AllInstances.FullNameGet = @this => "42"; 
    result = new DirectoryInfo(directoryName).GetFiles(fileName).First(); 
    Assert.AreEqual("42", result.FullName); // the fake fullname 
    Assert.AreEqual("test.txt", result.Name); // the real name 
} 

警告:工作我的機器(的Visual Studio 2013,.NET 4.5.1)

參考爲假貨文件上:Code generation, compilation, and naming conventions in Microsoft Fakes

+0

mscorlib.fakes中的額外內容也在這裏實現了。它也可以作爲一切事物的一個例子,而這些並不是開箱即用的,這很有道理。 – Dorival