0

我正在尝试接近 100% 的代码覆盖率,并且我对模拟 OpenFileDialog 很感兴趣。从一些研究来看,一个好的答案似乎是创建一个 IFileDialogService,就像Open File Dialog MVVM中的这段代码一样:

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

但是,这意味着我必须实现 OpenFileDialog 的所有属性和方法,并让它们成为调用真正 OpenFileDialog 的属性和方法的传递。

我希望做一些事情,比如拥有一个 MockContainer 和一个 RealContainer,每个都会返回他们的 OpenFileDialog 版本:

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

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

但是,我不能这样做,因为它们没有实现通用接口。如果我能够采用这种方法,我就不需要在 IOpenFileService 中为 OpenFileDialog 所需的所有内容创建传递方法。每个容器只会返回一个调用者可以使用的对话框。

有没有一种方法可以使这种方法起作用,或者 IOpenFileService 真的是这样做的方法吗?

注意:我知道模拟框架。我今天想快速实现一些东西,还不想花时间学习一个模拟框架。我想我可以很容易地自己嘲笑它。

4

1 回答 1

1

这是适配器模式的纯粹案例

你非常接近(你需要的最后一步是从一些基本接口继承MockContainer和继承 - 像这样:RealContainer

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

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

然后将它们模拟为IOpenFileDialog对象

于 2012-06-17T19:47:11.627 回答