2012-06-21 16 views
10

私はファイルストリームでの使用を模倣しようとしていますが、これを完了することができず、やり方がわからないので、私はrhino mockを使用しています。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 
} 

コードのこの分岐にアクセスできるように、どのように(FileStream ....)を使用して擬似するか教えてもらえますか?

答えて

9

あなたは、あなたがそれを可能なモック呼び出しだろうインターフェイスメソッドによって抽象File.Open()に持っています。

だから

1)インターフェイスを作成する:

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

2)変更LoadConnectionDetailsFromDisk()以下のように:

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)試験でインターフェースを模擬し、模擬

を注入
// 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 

LoadConnectionDetailsFromDisk()を考えれば、このメソッド呼び出しから模擬テストを直接実行することはできませんので、このメソッドの呼び出し方法を示してください。

0

のFileStreamがメソッドに渡されたように、あなたはファイルストリーム

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

のモックを作成できるように、私はあなたが本当に空想を取得したい場合は、常に、その後のIStreamを受け入れるとすることができる方法をリファクタリングう具象クラスのモックのIStreamが、Rhinoのサポートを作成することをモックは

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

この目的でSystemWrapper libを使用できます。これは、システムクラスをラッピングするインタフェースとクラスを含み、このクラスを使用してユニットテストメソッドを使用できるようにします。