2011-06-27 6 views
6

Jestem nowy w jednostce Testowanie i muszę sfałszować klasę statyczną File w przestrzeni nazw System.IO. Używam Rhinomock, co jest najlepszym sposobem, aby to osiągnąć,Mock File IO static class in C#

Powiedzmy muszę mock File.Exists, File.Delete ...

+0

Wiele przykładów na tej stronie już istnieje, użyj przycisku wyszukiwania – ChrisBint

+1

możliwy duplikat [Drwawienie metod statycznych przy użyciu Rhino.Mocks] (http: // stackoverflow.com/questions/540239/mocking-static-methods-using-rhino-mocks) – sarnold

+4

Czasami ludzie nie wiedzą, czego szukać, może mógłbyś podać kilka przykładów, zamiast być całkowicie bezużytecznymi. Tylko myśl. – CrazyDart

Odpowiedz

7

Nie można drwić metody statyczne z Rhino mock . Aby uzyskać więcej informacji, patrz this question. Można utworzyć klasę elewacji, aby zawinąć wywołania systemowe systemu plików, które będą używane, a następnie utworzyć fałszywą wersję tego.

+0

Zamiast tworzyć własną fasadę, użyj kogoś, kto już napisał dla ciebie: http://systemioabstractions.codeplex.com/ – vcsjones

+0

To jest świetne, zamierzam użyć tego open-source. –

+0

Nie jestem pewien czy umieściłbym mój jaja w koszu, które tylko około 50 innych osób chce używać ... ale to twój projekt. – CrazyDart

2

Powinieneś utworzyć usługę opakowania o nazwie IFileService, następnie możesz utworzyć konkretny, który używa statyki do użycia w twojej aplikacji, i fałszywą IFileService, która będzie mieć fałszywe funkcje do testowania. Upewnij się, że musisz przekazać IFileService do konstruktora lub właściwości dla jakiejkolwiek klasy, która używa tej klasy, w ten sposób normalna operacja wymaga przekazania w IFileService. Pamiętaj, że podczas testowania jednostkowego testujesz tylko tę część kodu, a nie rzeczy, które wywołuje ona, by polubić 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

Oprócz nie można kpić z Static łatwo odpowiedzieć.

Chciałbym zaznaczyć, że nie powinieneś kpić z pliku File.IO, ponieważ nie jest to typ, który posiadasz. Powinieneś only Mock types that you own.

3

Zobacz także Vadim 's SystemWrapper. Możesz kpić z niego a lot of system classes, ale musisz zastosować wzór dependency injection, aby testować kod.

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

Użyłem także klas otoki. Używam tego narzędzia można łatwo wygenerować klas otoki takie jak System.IO.File

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

Po zainstalowaniu pakietu po prostu wpisz w konsoli Menedżer pakietów

rusztowań Wrapper System.IO.File

Spowoduje to wygenerowanie interfejsu IFile.cs i jednej klasy otoki pliku File.cs. Następnie możesz użyć IFile do Mock i File.cs dla prawdziwej implementacji.

1

Dlaczego nie używać MS Fakes? Czy nie byłoby to proste, już obsługiwane w porównaniu z RhinoMocks, SystemWrapper.Wrapper i SystemWrapper.Interface?

+0

MS Fakes jest programem VS Enterprise-only funkcja, z tego co rozumiem. –

+1

Należy pamiętać, że MS Fakes jest dostępny od VS 2012, opublikował pytanie wcześniej! W przeszłości istniały stwardnienie rozsiane, ale nie były pewne jego ograniczeń. –