单元测试-c#中的模拟文件IO静态类

本文关键字:文件 IO 静态类 模拟 -c# 单元测试 | 更新日期: 2023-09-27 18:00:28

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

比方说我需要模拟File.Exists、File.Delete…

单元测试-c#中的模拟文件IO静态类

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

您应该创建一个名为IFileService的包装器服务,然后您可以创建一个使用静态的具体应用程序,以及一个具有虚假测试功能的模拟IFileService。使它成为您必须将IFileService传递到构造函数或任何正在使用它的类的属性中,这样正常操作需要传入IFileService。请记住,在单元测试中,您只测试代码的那一部分,而不是它调用的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");
    }
}

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

[Test]
public void Check_that_FileInfo_methods_Create_and_Delete_are_called()
{
    // Add mock repository.
    IFileInfoWrap fileInfoRepository = MockRepository.GenerateMock<IFileInfoWrap>();
    IFileStreamWrap fileStreamRepository = MockRepository.GenerateMock<IFileStreamWrap>();
    // 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();
}  

我还使用了包装器类。我使用此工具可以轻松地生成包装类,如System.IO.File

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

安装软件包后,只需在软件包管理器控制台上键入以下内容

脚手架包装系统.IO.File

这将生成IFile.cs接口和一个concreate包装类File.cs。然后,您可以使用IFile-to-Mock和File.cs进行实际实现。

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

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

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

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

要全面了解如何将moq与C#一起使用,请参阅以下文章。

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

谢谢,Erandika。