我有这段代码:
有这样的方法:
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()方法提供替代执行)或重构代码以使其更可测试(不会过度使用!!!)?
答案 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();
}
}