0

rhino mock の例で File 呼び出しをモックアウトすることは可能ですか?

  private ServerConnection LoadConnectionDetailsFromDisk(string flowProcess)
  {
       var appPath = System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath;
       var bodyFile = Path.Combine(appPath, @"XML\ServerConnections.xml");

        if (File.Exists(bodyFile))
        {
            //more logic
  }

そのため、File.Exists メソッドをモックして true を返すようにしようとしているので、ファイルが存在するかどうかに関係なく、ロジックの次のブランチをテストできます。これは可能ですか?

4

2 に答える 2

1

元のスニペットは次のとおりです。

private ServerConnection LoadConnectionDetailsFromDisk(string flowProcess)
{
   var appPath = System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath;
   var bodyFile = Path.Combine(appPath, @"XML\ServerConnections.xml");

    if (File.Exists(bodyFile))
    {
        //more logic
    }
}

System.IO ライブラリ (これはモックできません) を使用する代わりに、cadrell は基本的に、モックできる抽象化のレイヤーを追加するように言っていました。

private ServerConnection LoadConnectionDetailsFromDisk(string flowProcess)
{
   var appPath = System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath;
   var bodyFile = Path.Combine(appPath, @"XML\ServerConnections.xml");

    if (FileExists(bodyFile))
    {
        //more logic
    }
}

public bool FileExists(bodyFile) { return File.Exists(bodyFile) }

これで、テストで、既存のコードのほとんどを使用する (テストが可能になる) PartialMock を定義できますが、FileExists メソッドだけをオーバーライドできます。

var myPartialMock = mockRepo.PartialMock(typeof(MyObject));

myPartialMock.Expect(m=>m.FileExists("")).IgnoreArguments().Return(true);

myPartialMock.LoadConnectionDetailsFromDisk("myProcess");

これで、if ステートメント内からの呼び出しは常に true を返します。

他に考慮すべきことがあります。ファイルの存在を前提とする if ブロックが表示されます。あなたはコードを指定しませんでしたが、あなた以外の誰かが (コードを変更できるので)、そのコードが現在存在することがわかっているファイルを開いたり操作したりすることは間違いありません。そのため、メソッド全体が、単体テストできることとできないことの境界にぴったりとぶつかります。このメソッドをリファクタリングして、別の関数から Stream を取得することを検討できます (その関数をモックして、MemoryStream にテスト データを挿入できます)。 .NET チームが仕事をしており、File.Exists、File.Open などの呼び出しが期待どおりに機能することを信頼してください。

于 2012-06-21T14:24:23.447 に答える
0

インターフェイスを使用して抽象化します。

public Interface IFileChecker
    {
       bool FileExists(string path)
    }

次に、インターフェイスを使用してモック オブジェクトを作成します。

IFileChecker fileChecker = mocks.Stub<IFileChecker>();

using (mocks.Record())
            {
                fileChecker.Stub(i => i.FileExists(Arg<string>.Is.Any)).Return(true);
            }
于 2012-06-21T15:01:39.937 に答える