C# 模拟OpenFileDialog的选项

C# 模拟OpenFileDialog的选项,c#,mocking,C#,Mocking,我试图接近100%的代码覆盖率,我对模拟OpenFileDialog感兴趣。根据一些研究,一个好的答案似乎是创建IFileDialogService,如下代码所示: 然而,这意味着我必须实现OpenFileDialog的所有属性和方法,并将它们作为调用真正OpenFileDialog的属性和方法的通道 我希望做一些事情,比如有一个MockContainer和一个RealContainer,每个都会返回他们的OpenFileDialog版本: public class MockContainer

我试图接近100%的代码覆盖率,我对模拟OpenFileDialog感兴趣。根据一些研究,一个好的答案似乎是创建IFileDialogService,如下代码所示:

然而,这意味着我必须实现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真的是这样做的

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

这是一个纯粹的例子

您非常接近(您需要的最后一步是从某个基本接口继承
MockContainer
RealContainer
,如下所示:

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

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

然后将它们模拟为
IOpenFileDialog
object

是的。我曾考虑过将其子类化,但不能……在这个实现中,我不必在RealContainer中实现所有OpenFileDialog方法吗?@BobHorn你不必。将
IOpenFileDialog
重构为你需要的属性和函数。对。我需要实现输入我需要的所有属性和方法,只需在真正的对话框上调用相同的属性/方法。虽然我希望避免这样做,但这似乎是唯一的方法。谢谢。模拟
OpenFileDialog
最困难的部分是这个对话框是Win32纯窗口和OpenFileDialog,它只是它的包装。可能是你可以找到一种方法,但我在互联网上搜索过,没有自动/模拟的方法来插入文件名并在没有自动化帮助的情况下单击“确定”按钮。这导致类包装了自动化(FindWindow、Invoke on button等)。OpenFile、SaveFile和FontDialog很难模拟对话框,几乎总是需要包装器:(
public class MockContainer : IOpenFileDialog 
{
    IOpenFileDialog FileDialog { get { return this; } }
}

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