Аз съм нов в Unit Testing и трябва да се подигравам на статичния клас File в пространството на имената System.IO. Използвам Rhinomock, кой е най-добрият начин да постигна това,
Да кажем, че трябва да се подиграя на File.Exists,File.Delete ...
Аз съм нов в Unit Testing и трябва да се подигравам на статичния клас File в пространството на имената System.IO. Използвам Rhinomock, кой е най-добрият начин да постигна това,
Да кажем, че трябва да се подиграя на File.Exists,File.Delete ...
Не можете да имитирате статични методи с Rhino mock. Вижте този въпрос за повече информация. Можете да създадете фасаден клас, за да обвиете извикванията на файловата система, които ще използвате, и след това да създадете макетна версия на това.
Трябва да създадете услуга за обвивка, наречена 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");
}
}
Вижте също Вадим 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();
}
Използвах и обвиващи класове. Използвам този инструмент за лесно генериране на обвиващи класове като 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 за истинската реализация.
Защо не използвате MS Fakes? Няма ли да е просто, вече поддържано в сравнение с RhinoMocks, SystemWrapper.Wrapper и SystemWrapper.Interface?
В допълнение към не можете да се подигравате Статичен отговор лесно.
Бих искал да отбележа, че не трябва да се подигравате на типа File.IO, защото това не е тип, който притежавате. Трябва да само Mock типове, които притежавате.
Можете да използвате moq framework за това. Това е проект на Google с отворен код, който можете да изтеглите от тук. Изтеглете рамката Moq
За да разберете напълно как да използвате moq с C#, моля, вижте следната статия.
http://learningcsharpe.blogspot.com/2011/11/how-to-use-moq-library-for-your-unit.html
благодаря, Ерандика.