Статический класс Mock File IO в c # - PullRequest
6 голосов
/ 28 июня 2011

Я новичок в модульном тестировании, и мне нужно смоделировать статический класс File в пространстве имен System.IO.Я использую Rhinomock, что является лучшим способом сделать это,

Допустим, мне нужно издеваться над File.Exists, File.Delete ...

Ответы [ 7 ]

7 голосов
/ 28 июня 2011

Вы не можете высмеивать статические методы с помощью насмешки Rhino. См. этот вопрос для получения дополнительной информации. Вы можете создать класс фасадов, чтобы обернуть вызовы файловой системы, которые вы будете использовать, а затем создать фиктивную версию этого.

3 голосов
/ 28 июня 2011

См. Также Вадим 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();
}  
2 голосов
/ 28 июня 2011

Вы должны создать сервис-оболочку под названием 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");
    }
}
1 голос
/ 19 мая 2017

Почему бы не использовать MS Fakes?Разве это не просто, уже поддерживается по сравнению с RhinoMocks, SystemWrapper.Wrapper и SystemWrapper.Interface?

1 голос
/ 27 августа 2013

Я также использовал классы-оболочки. Я использую этот инструмент для простого создания классов-оболочек, таких как System.IO.File

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

После установки пакета просто введите следующее в консоли диспетчера пакетов

Система упаковочных лесов. Файл. 1009 *

Это создаст интерфейс IFile.cs и один конкретный класс-оболочку File.cs. Затем вы можете использовать IFile для Mock и File.cs для реальной реализации.

0 голосов
/ 05 ноября 2011

Вы можете использовать moq framework для этого. Это проект Google с открытым исходным кодом, который вы можете скачать здесь. Скачать Moq framework

Чтобы получить полное представление о том, как использовать moq с C #, пожалуйста, обратитесь к следующей статье.

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

спасибо, Erandika.

0 голосов
/ 28 июня 2011

В дополнение к вы не можете издеваться над Static легко ответить.

Я хотел бы отметить, что вы не должны насмехаться над типом File.IO, потому что это не тот тип, которым вы владеете. Вам следует использовать только те типы макетов, которыми вы владеете .

...