私は単体テストを始めたばかりで、Microsoft Fakes フレームワークを調べています。主な理由は、無料であり、Emulators パッケージを使用して SharePoint オブジェクトを簡単にモックできるからです。SOや他の場所で、シムが悪であるというさまざまな言及を見てきましたが、その理由は多かれ少なかれ理解しています. 私が得られないのは、特定のケースでそれらを回避する方法です。つまり、「シムを使用する必要がないようにコードをリファクタリングするにはどうすればよいですか?」ということです。
問題のコードでは、プロパティとメソッドを持つ JobProcessor オブジェクトがあり、そのうちのいくつかは public Execute メソッドからのみ呼び出す必要があるため、プライベートです。Execute が呼び出され、追加のロギングを行う必要があるため、その Process メソッドが呼び出されるジョブが利用可能であることをテストしたいと思います。
関連するコードは次のとおりです。
//in system under test - JobProcessor.cs
private IJob CurrentJob { get; set; }
public void Execute()
{
GetJobToProcess(); //stores Job in CurrentJob property if found
if (ShouldProcessJob){
CurrentJob.ProcessJob();
}
}
ProcessJob がテストから呼び出された場合、追加の処理を実行する必要があるため、これらの追加処理を実行するためにテスト メソッドにスタブを設定します。
StubIJob fakeJob = new StubIJob(){
ProcessJob = () =>{
//do my extra things here
}
};
私は別の場所で ProcessJob メソッド自体をテストしているので、ここで余分なものを実行する以外は気にしません。理解したところで、JobProcessor (テスト対象のシステム) からのプライベート メソッド GetJobsToProcess が偽のジョブを返すように Shim を設定する必要があります。これにより、スタブ メソッドが呼び出されます。
processor = new JobProcessor();
ShimJobProcessor.AllInstances.GetJobToProcess = (@this) =>{
var privateProcessor = new PrivateObject(processor);
privateProcessor.SetProperty("CurrentJob", fakeJob); //force my test Job to be processed so the Stub is used
};
この場合、Shim を使用しないようにするにはどうすればよいですか? それは問題ですか?
ありがとう。