System.Diagnostics.Process.Start呼び出しをモックしたいので、システムアセンブリに Fakes アセンブリを追加しました。
問題は、StartがSystem.Diagnostics.Processの静的メソッドであるため、Start メソッドのデリゲートをホックできるシムを取得していないことです。
これを行う正しい方法は何ですか?
System.Diagnostics.Process.Start呼び出しをモックしたいので、システムアセンブリに Fakes アセンブリを追加しました。
問題は、StartがSystem.Diagnostics.Processの静的メソッドであるため、Start メソッドのデリゲートをホックできるシムを取得していないことです。
これを行う正しい方法は何ですか?
まず、Process クラスの Shim を生成する必要があります。
Fakes for System を作成すると、「Fakes」というフォルダが表示されます。そのフォルダー内で System.fakes ファイルを編集して、System.Diagnostics.Process の Shim を生成する必要があります。
<Fakes xmlns="http://schemas.microsoft.com/fakes/2011/" Diagnostic="true">
<Assembly Name="System" Version="4.0.0.0"/>
<ShimGeneration>
<Add FullName="System.Diagnostics.Process"/>
</ShimGeneration>
</Fakes>
コンパイル後、オブジェクト エクスプローラーで、プロセス用の Fakes Shim が生成されたことを確認できます。
テストで Shim を使用するには、Fake Process.Start デリゲートを構成する必要があります。テストは次のようになります。
using (ShimsContext.Create())
{
System.Diagnostics.Fakes.ShimProcess.StartString = s =>
{
Console.WriteLine(s);
return new StubProcess();
};
// A call to your method under test that exectues Process.Start rather than calling it directly
var process = Process.Start("SomeString");
Assert.IsTrue(process is StubProcess);
}
明らかに、デリゲートとアサーションにシナリオ テストに関連するものを含めたいと思うかもしれません。
MSDN リンクを参照
匿名デリゲートを使用できます
()=> Process.Start("your.exe");
例えば
class Program
{
static void Main(string[] args)
{
RunnerClass runner = new RunnerClass();
runner.runProgram += (exeFile) => Process.Start("your.exe");
string runApp = "run.exe";
runner.runProgram(runApp);
}
}
public class RunnerClass
{
public Action<string> runProgram;
}