Статичен клас Mock File IO в c#

Аз съм нов в Unit Testing и трябва да се подигравам на статичния клас File в пространството на имената System.IO. Използвам Rhinomock, кой е най-добрият начин да постигна това,

Да кажем, че трябва да се подиграя на File.Exists,File.Delete ...


person David MZ    schedule 27.06.2011    source източник
comment
Вече има много примери на този сайт, използвайте бутона за търсене   -  person ChrisBint    schedule 28.06.2011
comment
възможен дубликат на Mocking Static методи с помощта на Rhino.Mocks   -  person sarnold    schedule 28.06.2011
comment
Понякога хората не знаят какво да търсят, може би бихте могли да дадете някои примери, вместо да сте напълно безполезни. Просто мисъл.   -  person CrazyDart    schedule 28.06.2011


Отговори (7)


Не можете да имитирате статични методи с Rhino mock. Вижте този въпрос за повече информация. Можете да създадете фасаден клас, за да обвиете извикванията на файловата система, които ще използвате, и след това да създадете макетна версия на това.

person Don Kirkby    schedule 27.06.2011
comment
Вместо да правите своя собствена фасада, използвайте такава, която някой друг вече е написал за вас: systemioabstractions.codeplex.com - person vcsjones; 28.06.2011
comment
Thx, това е страхотно, ще използвам този отворен код - person David MZ; 28.06.2011
comment
Не съм сигурен, че бих сложил яйцата си в кошница, която само около 50 други хора са готови да използват... но това е вашият проект. - person CrazyDart; 28.06.2011
comment
@CrazyDart - Всъщност не всичките ви яйца са в кошница. Това е с отворен код, запазете копие от източника за себе си, ако ви харесва. - person vcsjones; 08.07.2011

Трябва да създадете услуга за обвивка, наречена IFileService, след което можете да създадете бетон, който използва статиката за използване във вашето приложение, и макет 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");
    }
}
person CrazyDart    schedule 27.06.2011

Вижте също Вадим nofollow">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();
}  
person Yann Trevin    schedule 28.06.2011

Използвах и обвиващи класове. Използвам този инструмент за лесно генериране на обвиващи класове като System.IO.File

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

След като инсталирате пакета, просто въведете следното в конзолата на Package Manager

Scaffold Wrapper System.IO.File

Това ще генерира интерфейс IFile.cs и един конкретен клас обвивка File.cs. След това можете да използвате IFile to Mock и File.cs за истинската реализация.

person Francis    schedule 27.08.2013

Защо не използвате MS Fakes? Няма ли да е просто, вече поддържано в сравнение с RhinoMocks, SystemWrapper.Wrapper и SystemWrapper.Interface?

person pixel    schedule 19.05.2017
comment
Доколкото разбирам, MS Fakes е функция само за VS Enterprise. - person Shafiq Jetha; 21.12.2017
comment
Имайте предвид, че MS Fakes е наличен от VS 2012, той публикува въпроса преди това! Имаше MS бенки преди, но не съм сигурен за границите му. - person Bahadır İsmail Aydın; 25.01.2018

В допълнение към не можете да се подигравате Статичен отговор лесно.

Бих искал да отбележа, че не трябва да се подигравате на типа File.IO, защото това не е тип, който притежавате. Трябва да само Mock типове, които притежавате.

person Gishu    schedule 28.06.2011

Можете да използвате moq framework за това. Това е проект на Google с отворен код, който можете да изтеглите от тук. Изтеглете рамката Moq

За да разберете напълно как да използвате moq с C#, моля, вижте следната статия.

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

благодаря, Ерандика.

person Erandika Sandaruwan    schedule 05.11.2011
comment
Moq не може да тества статични класове, вижте stackoverflow.com/questions/12580015/ - person guillem; 10.04.2013