2012-06-21 9 views
10

Ich habe versucht, eine Verwendung mit einem Dateistream zu verspotten, aber nicht in der Lage, dies zu vervollständigen und bin mir nicht sicher, wie es geht, verwende ich Rhino Mock.Mocking eine Verwendung mit einem FileStream

Kann mir jemand sagen, wie man die Verwendung (FileStream ....) verspotten, so dass ich auf diesen Zweig des Codes zugreifen kann?

Antwort

9

Sie müssen abstrakte File.Open() durch eine Interface-Methode dann würden Sie in der Lage spöttischer Anruf es sein.

So

1) Erstellen Sie eine Schnittstelle:

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

2) Ändern LoadConnectionDetailsFromDisk(), wie folgend:

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 einem Test der Schnittstelle verspotten und ein Mock

injizieren
// 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 

Wenn Sie bedenken, dass LoadConnectionDetailsFromDisk() Sie können nicht direkt Mock direkt zu dieser Methode Aufruf von einem Test injizieren, so zeigen Sie bitte, wie diese Methode aufgerufen wird.

0

ich die Methode Refactoring würde, so dass die Filestream an die Methode übergeben wird, so dass Sie

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

ein Modell des Filestream erstellen können, wenn Sie wirklich Lust möchten erhalten Sie einen IStream immer akzeptieren und dann Mock, dass IStream aber Rhino Unterstützung zu schaffen Mocks von concreate Klassen

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

Sie können SystemWrapper lib für diesen Zweck verwenden. Es enthält Schnittstellen und Klassen, die Systemklassen umschließen, und ermöglicht es Ihnen, Testmethoden zu testen, die diese Klassen verwenden.