c#中的模拟文件IO静态类

我是Unit Testing的新手,我需要在System.IO命名空间中模拟File静态类。 我正在使用Rhinomock,实现这一目标的最佳方法是什么,

让我说我需要模拟File.Exists,File.Delete ……

你不能用Rhino mock模拟静态方法。 有关详细信息,请参阅此问题 。 您可以创建一个外观类来包装您将使用的文件系统调用,然后创建它的模拟版本。

另见Vadim的SystemWrapper 。 您可以使用它模拟许多系统类 ,但是您需要应用依赖项注入模式来使您的代码可测试。

[Test] public void Check_that_FileInfo_methods_Create_and_Delete_are_called() { // Add mock repository. IFileInfoWrap fileInfoRepository = MockRepository.GenerateMock(); IFileStreamWrap fileStreamRepository = MockRepository.GenerateMock(); // Create expectations fileInfoRepository.Expect(x => x.Create()).Return(fileStreamRepository); fileStreamRepository.Expect(x => x.Close()); fileInfoRepository.Expect(x => x.Delete()); // Test new FileInfoSample().CreateAndDeleteFile(fileInfoRepository); // Verify expectations. fileInfoRepository.VerifyAllExpectations(); fileStreamRepository.VerifyAllExpectations(); } 

您应该创建一个名为IFileService的包装器服务,然后您可以创建一个使用静态函数在您的应用程序中使用的具体项,以及一个具有虚假function进行测试的模拟IFileService。 这样做你必须将IFileService传递给构造函数或属性,因为正常的操作需要你传入IFileService。 请记住,在unit testing中,您只测试代码的那部分,而不是像IFileService那样调用的东西。

 interface IFileService { bool Exists(string fileName); void Delete(string fileName); } class FileService : IFileService { public bool Exists(string fileName) { return File.Exists(fileName); } public void Delete(string fileName) { File.Delete(fileName); } } class MyRealCode { private IFileService _fileService; public MyRealCode(IFileService fileService) { _fileService = fileService; } void DoStuff() { _fileService.Exists("myfile.txt"); } } 

我也使用了包装类。 我使用此工具轻松生成包装类,如System.IO.File

https://www.nuget.org/packages/Digitrish.WrapperGenerator/

安装包后,只需在Package Manager控制台上键入以下内容即可

Scaffold Wrapper System.IO.File

这将生成IFile.cs接口和一个concreate包装类File.cs. 然后你可以使用IFile到Mock和File.cs来实现真正的实现。

为什么不使用MS Fakes? 与RhinoMocks,SystemWrapper.Wrapper和SystemWrapper.Interface相比,这不是很简单吗?

除了你不能模拟静态轻松回答。

我想指出你不应该嘲笑File.IO类型,因为它不是你拥有的类型。 你应该只拥有你拥有的模拟类型 。

你可以使用moq框架。这是一个开源的谷歌项目,你可以从这里下载。 下载Moq框架

要充分了解如何在C#中使用moq,请参阅以下文章。

http://learningcsharpe.blogspot.com/2011/11/how-to-use-moq-library-for-your-unit.html

谢谢,Erandika。