元のスニペットは次のとおりです。
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 などの呼び出しが期待どおりに機能することを信頼してください。