使用Microsoft Fakes的Stub或Shim Process类

时间:2015-03-25 20:58:30

标签: c# unit-testing microsoft-fakes

我有这段代码:

有这样的方法:

private void Invoke(string executablePathAndFile, string commandLineArguments)
{
    Process process = ProcessInstance;
    ProcessStartInfo startInfo = ProcessStartInfo;

    startInfo.FileName = executablePathAndFile;
    startInfo.Arguments = commandLineArguments; 

    process.StartInfo = startInfo;

    process.Start();

    if (WaitForExit)
        process.WaitForExit();
}

我正在尝试存根或填充Process类的方法调用。 Microsoft Fakes只创建一个Stub而不是Shim(不确定为什么)。我可以在对ProcessInstanceGet的调用调用中提供StubProcess:

InvokeExecutableAction sut = new InvokeExecutableAction(actionElement);
StubProcess stubProcess = new StubProcess();
ShimInvokeExecutableAction sutShim = new ShimInvokeExecutableAction(sut)
{
    ProcessInstanceGet = () => stubProcess
};

但是当测试中的代码进入process.Start()时,它会返回Win32Exception。我无法为存根的Start方法提供替代实现,如:

有没有办法实现我需要的东西(即为Start()方法提供替代执行)或重构代码以使其更可测试(不会过度使用!!!)?

3 个答案:

答案 0 :(得分:1)

在system.fakes的XML中添加它,而不是在mscorlib.fakes的XML中添加

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

答案 1 :(得分:1)

您必须编辑System.fakes文件,如下所示,以便它将生成Shims for System.Diagnostics.Process

<Fakes xmlns="http://schemas.microsoft.com/fakes/2011/" Diagnostic="true">
  <Assembly Name="System" Version="4.0.0.0"/>
  <ShimGeneration>
    <Add FullName="System.Diagnostics.Process"/>
  </ShimGeneration>
</Fakes>

可能重复: How to use Microsoft Fakes Assemblies on Process.Start

答案 2 :(得分:0)

据我所知,你必须首先添加一个假货组件。 process中的System.dll课程等等

  

1.在Solution Explorer中,展开单元测试项目的References。

     

2.选择system.dll程序集。

     

3.在快捷菜单上,选择Add Fakes Assembly。

然后使用填充方法。这里有一个很好的例子https://msdn.microsoft.com/en-us/library/hh549176.aspx

[Test]
public void Y2kCheckerTest() {
  using(ShimsContext.Create()) {
    ShimDateTime.NowGet = () => new DateTime(2000, 1, 1);
    Y2KChecker.Check();
  }
}