是否有可能在从C#应用程序中移出时虚拟化控制台应用程序的磁盘访问

时间:2010-09-22 18:00:46

标签: c# virtualization

我有应用程序A将应用程序B作为控制台应用程序运行。我想将单元测试作为应用程序A的一部分来编写,它验证了应用程序B的输入/输出,但是应用程序B使用硬编码路径来查找其中的一些输入。我希望能够运行该应用程序,但拦截从c:\ wherever \ whatever.txt读取的调用,并自己提供该文件的内容。

任何可以为我做这个的框架或部分?

3 个答案:

答案 0 :(得分:1)

这需要修补Win32 CreateFile API函数。对于Microsoft Research的Detours而言,这在技术上是可行的。这需要非托管C或C ++。

在源代码处理此问题,在源代码中使用硬编码的路径名称是不合理的。

答案 1 :(得分:0)

这几乎是不可能的!!我说几乎是因为它可以拦截CLR中的呼叫,但它是黑魔法,除非你是一个CLR开发人员,否则不推荐 - 也许是世界上几百人。

您可以将硬编码路径作为命令行参数,并以这种方式解决您的问题。

答案 2 :(得分:0)

您可以在应用程序A中包含应用程序B作为引用,然后在直接调用它的API时使用Mocking框架来更改B的方法或属性的行为。这与设置对依赖项的期望时用于单元测试的过程相同。有一些限制通常只有在有问题的对象是接口或包含vi时才有效 rtual(可覆盖)方法/属性。该解决方案还可能依赖于能够将依赖项注入Bs API,这可能会也可能不会取决于场景。

Moq,Rhino Mocks。和TypeMock都提供此功能。下面是Moq的一个简单示例,它使用替代值覆盖GetPath方法的行为:

// create a mocked version of a class and setup an expectation
var appBClassMoq = new Mock<AppBClass>();
appBClassMoq.SetUp(o => o.GetPath()).Returns("C:\MyNewPath");

// get the mocked instance
var appBClass = appBClassMoq.Object;

// run some code, when it hits GetPath() it will return the mock value
appBClass.SomeMethodThatCallsGetPath();