4

System.Diagnostics.Process.Start呼び出しをモックしたいので、システムアセンブリに Fakes アセンブリを追加しました。

問題は、StartがSystem.Diagnostics.Processの静的メソッドであるため、Start メソッドのデリゲートをホックできるシムを取得していないことです。

これを行う正しい方法は何ですか?

4

2 に答える 2

11

まず、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 リンクを参照

于 2014-03-04T09:56:16.020 に答える
-1

匿名デリゲートを使用できます

()=> 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;
}    
于 2013-09-04T10:21:18.337 に答える