2012-06-21 45 views
0

是否可以模拟出文件犀牛模拟例如来电:惩戒文件犀牛模拟电话

private ServerConnection LoadConnectionDetailsFromDisk(string flowProcess) 
    { 
     var appPath = System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath; 
     var bodyFile = Path.Combine(appPath, @"XML\ServerConnections.xml"); 

     if (File.Exists(bodyFile)) 
     { 
      //more logic 
    } 

所以我试图嘲弄File.Exists方法,这样它会返回true,所以我能够无论文件是否存在,都要测试下一个逻辑分支。这可能吗?

+1

摘要,检查您可以注入的接口。模拟界面。 – cadrell0

+0

@ cadrell0你能提供一个简短的例子吗? – user101010101

回答

1

这是你原来的片断:

private ServerConnection LoadConnectionDetailsFromDisk(string flowProcess) 
{ 
    var appPath = System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath; 
    var bodyFile = Path.Combine(appPath, @"XML\ServerConnections.xml"); 

    if (File.Exists(bodyFile)) 
    { 
     //more logic 
    } 
} 

而不是使用System.IO库(这是不可能的嘲笑),cadrell已基本说来添加一个抽象层,你可以嘲笑:

现在
private ServerConnection LoadConnectionDetailsFromDisk(string flowProcess) 
{ 
    var appPath = System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath; 
    var bodyFile = Path.Combine(appPath, @"XML\ServerConnections.xml"); 

    if (FileExists(bodyFile)) 
    { 
     //more logic 
    } 
} 

public bool FileExists(bodyFile) { return File.Exists(bodyFile) } 

,在您的测试,你可以定义使用大部分现有的代码的PartialMock(允许你进行测试),但允许您覆盖只是FILEEXISTS方法:

var myPartialMock = mockRepo.PartialMock(typeof(MyObject)); 

myPartialMock.Expect(m=>m.FileExists("")).IgnoreArguments().Return(true); 

myPartialMock.LoadConnectionDetailsFromDisk("myProcess"); 

现在,您的if语句中的调用总是返回true。

其他要考虑的事情;我看到一个if块是以文件的存在为基础的。您没有指定代码,但我会打赌别人,但你(因为你可以更改代码)代码打开或操纵我们现在知道存在的文件。所以,整个方法都会碰到你能够和不能进行单元测试的边界。您可以考虑重构此方法以从另一个函数获取Stream(允许您嘲笑该函数并向测试数据注入MemoryStream),但是在某些时候,您会刮掉“沙箱”的边缘,只需要相信.NET团队完成了他们的工作,并调用File.Exists,File.Open等按预期工作。

+0

谢谢你,根据你最后的评论我有另一个功能,获取蒸汽等我认为不相信.net团队:)! – user101010101

0

使用接口将其抽象出来。

public Interface IFileChecker 
    { 
     bool FileExists(string path) 
    } 

然后使用该接口来创建您的模拟对象。

IFileChecker fileChecker = mocks.Stub<IFileChecker>(); 

using (mocks.Record()) 
      { 
       fileChecker.Stub(i => i.FileExists(Arg<string>.Is.Any)).Return(true); 
      }