使用Rhino Mock模拟文件调用

时间:2012-06-21 14:05:00

标签: c# .net rhino-mocks

是否可以使用rhino模拟示例模拟文件调用:

  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,所以我能够测试逻辑的下一个分支,无论文件是否存在。这可能吗?

2 个答案:

答案 0 :(得分: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等按预期工作。

答案 1 :(得分: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);
            }
相关问题