2012-06-21 76 views
10

Ho cercato di prendere in giro un utilizzo con un flusso di file, ma non sono stato in grado di completare questo e sono incerto su come farlo, sto usando Rhino Mock.Mocking a Using con un FileStream

private Connection LoadConnectionDetailsFromDisk(string bodyFile) 
{  
    //logic before 
    using (FileStream fs = File.Open(bodyFile, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) 
    { 
    return this.serverConfiguration.LoadConfiguration(fs, flowProcess); 
    } 
    //more logic 
} 

Qualcuno potrebbe dirmi come prendere in giro il tramite (FileStream ....), quindi sono in grado di accedere a questo ramo del codice?

risposta

9

Devi astratta File.Open() da un metodo di interfaccia allora si sarebbe in grado di scherno chiamata ad esso.

Così

1) Creare un'interfaccia:

public interface IFileDataSource 
{ 
    FileStream Open(string path, 
        FileMode mode, 
        FileAccess access, 
        FileShare share); 
} 

2) Modificare LoadConnectionDetailsFromDisk() come segue:

private Connection LoadConnectionDetailsFromDisk(string path, IFileDataSource fileSource) 
{  
    using (FileStream fs = fileSource.Open(bodyFile, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) 
    { 
     return this.serverConfiguration.LoadConfiguration(fs, flowProcess); 
    } 

    //more logic 
} 

3) In un test di simulazione l'interfaccia e iniettare un mock

// create a mock instance 
var sourceMock = MockRepository.GenerateMock<IFileDataSource>(); 

// setup expectation 
sourceMock.Expect(m => m.Open("path", FileMode.Open, FileAccess.Read, FileShare.ReadWrite) 
     .CallBack(
delegate (string path, FileMode mode, FileAccess access, FileShare share) 
{ 
     // handle a call 

    return true; 
}).Repeat.Any(); 

// TODO: depends on how you are triggering LoadConnectionDetailsFromDisk method call 
// inject a mock 

Considerando che LoadConnectionDetailsFromDisk() non è possibile iniettare simulazioni direttamente a questo metodo, si chiama da un test quindi si prega di mostrare come questo metodo viene invocato.

0

avrei refactoring il metodo in modo che il FileStream viene passato al metodo in modo che è possibile creare un modello del filestream

private Connection LoadConnectionDetailsFromDisk(FileStream bodyFile) 
{ 
    .... 
} 

se davvero si vuole ottenere fantasia si può sempre accettare un IStream e poi Mock deride che il sostegno IStream ma Rhino creando delle classi Concreate

MockRepository mocks = new MockRepository(); 
FileStream basket = mocks.CreateMock<FileStream>(); 
1

È possibile utilizzare SystemWrapper lib per questo scopo. Contiene interfacce e classi che avvolgono le classi di sistema e consente di unire i metodi di test usando queste classi.