我有应用程序A将应用程序B作为控制台应用程序运行。我想将单元测试作为应用程序A的一部分来编写,它验证了应用程序B的输入/输出,但是应用程序B使用硬编码路径来查找其中的一些输入。我希望能够运行该应用程序,但拦截从c:\ wherever \ whatever.txt读取的调用,并自己提供该文件的内容。
任何可以为我做这个的框架或部分?
答案 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();