2012-06-17 53 views
0

我試圖更接近100%的代碼覆蓋率,並且我對模擬OpenFileDialog感興趣。從一些研究,似乎一個很好的答案是創建一個IFileDialogService,像這樣的代碼Open File Dialog MVVM模擬OpenFileDialog的選項

public interface IOpenFileService 
{ 
    string FileName { get; } 
    bool OpenFileDialog() 
    // Many other methods and properties of OpenFileDialog here... 
} 

然而,這意味着我必須實現所有屬性和打開文件對話框的方法,只是讓他們是一個傳遞來調用真正的OpenFileDialog的屬性和方法。

我希望這樣做有MockContainer和RealContainer,每個將返回他們的打開文件對話框的版本:

public class MockContainer 
{ 
    IOpenFileDialog FileDialog { get { return new MockOpenFileDialog(); } } 
} 

public class RealContainer 
{ 
    IOpenFileDialog FileDialog { get { return new OpenFileDialog(); } } 
} 

但是,我不能這樣做,因爲他們沒有實現一個共同的接口。如果我能夠採用這種方法,則不需要在IOpenFileService中爲OpenFileDialog所需的所有內容創建傳遞方法。每個容器只會返回一個調用者可以使用的對話框。

有沒有一種方法可以使這種方法奏效,還是IOpenFileService真的可以做到這一點?

注:我知道嘲笑框架。我想今天快速實現一些東西,並且不想花時間學習一個嘲諷的框架。我想我可以很容易地嘲笑它。

+0

OpenFileDialog是密封的嗎? –

+0

是的。我想了解它的子類,但不能... –

回答

1

這是Adapter pattern

你是非常接近(你需要的最後一步是繼承了一些基本接口都MockContainerRealContainer一個純粹的情況下 - 就像這樣:

public class MockContainer : IOpenFileDialog 
{ 
    IOpenFileDialog FileDialog { get { return this; } } 
} 

public class RealContainer : IOpenFileDialog 
{ 
    IOpenFileDialog FileDialog { get { return this; } } 
} 

,然後嘲笑他們as IOpenFileDialog object

+0

在這個實現中,我不必實現所有的RealContainer中的OpenFileDialog方法? –

+0

@BobHorn你不需要。將'IOpenFileDialog'重構爲您需要的屬性和函數。 – Jasper

+0

沒錯。我需要實現我需要的所有屬性和方法,並在真正的對話框中調用相同的屬性/方法。雖然我希望避免這樣做,但它似乎是唯一的方法。謝謝。 –