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

时间:2011-06-27 22:52:49

标签: c# unit-testing nunit rhino-mocks

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

假设我需要模拟File.Exists,File.Delete ......

7 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:3)

另请参阅VadimSystemWrapper。您可以使用它来模拟a lot of system classes,但是您需要应用dependency injection模式才能使代码可以测试。

[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();
}  

答案 2 :(得分:2)

您应该创建一个名为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");
    }
}

答案 3 :(得分:1)

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

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

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

即可

Scaffold Wrapper System.IO.File

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

答案 4 :(得分:1)

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

答案 5 :(得分:0)

除了你无法模拟静态轻松回答。

我想指出你不应该嘲笑File.IO类型,因为它不是你拥有的类型。你应该only Mock types that you own

答案 6 :(得分:-1)

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

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

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

感谢, Erandika。