单元测试中的Mock File.Exists方法(C#)

时间:2011-07-31 23:19:16

标签: c# .net unit-testing moq

  

可能重复:
  .NET file system wrapper library

我想编写一个测试文件内容加载的测试。在示例中,用于加载内容的类是

FileClass

和方法

GetContentFromFile(string path).

有没有办法嘲笑

File.exists(string path)
具有moq?

的给定示例中的

方法

示例:

我有一个类有这样的方法:

public class FileClass 
{
   public string GetContentFromFile(string path)
   {
       if (File.exists(path))
       {
           //Do some more logic in here...
       }
   }
}

1 个答案:

答案 0 :(得分:5)

由于Exists方法是File类的静态方法,因此无法模拟它(请参阅底部的注释)。解决此问题的最简单方法是在File类周围编写一个瘦包装器。这个类应该实现一个可以注入你的类的接口。

public interface IFileWrapper {
    bool Exists(string path);
}

public class FileWrapper : IFileWrapper {
    public bool Exists(string path) {
        return File.Exists(path);
    }
}

然后在你的课堂上:

public class FileClass {
   private readonly IFileWrapper wrapper;

   public FileClass(IFileWrapper wrapper) {
       this.wrapper = wrapper;
   }

   public string GetContentFromFile(string path){
       if (wrapper.Exists(path)) {
           //Do some more logic in here...
       }
   }
}

注意: TypeMock允许您模拟静态方法。其他流行的框架,例如Moq,Rhino Mocks等不会。