16

私はファイル ストリームを使用してモックを作成しようとしましたが、これを完了することができず、その方法がわかりません。rhino モックを使用しています。

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
}

using(FileStream....) をモックして、コードのこのブランチにアクセスできるようにする方法を教えてもらえますか?

4

6 に答える 6

13

インターフェースメソッドで抽象化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()テストからこのメソッド呼び出しにモックを直接注入できないことを考慮して、このメソッドがどのように呼び出されるかを示してください。

于 2012-06-21T15:23:10.110 に答える
0

ファイルストリームのモックを作成できるように、FileStream がメソッドに渡されるようにメソッドをリファクタリングします。

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

本当に凝りたい場合は、いつでも IStream を受け入れてからその ISt​​ream をモックできますが、Rhino は concreate クラスのモックの作成をサポートしています

 MockRepository mocks = new MockRepository();
 FileStream basket = mocks.CreateMock<FileStream>();
于 2012-06-21T15:22:47.637 に答える