5

VS 2008の組み込みの単体テストフレームワークと、テストしているメソッドを使用してC#単体テストを作成しようとしていますEnvironment.Exit(0)。単体テストでこのメソッドを呼び出すと、単体テストは中止されます。メソッドは確かにを呼び出す必要がありExit、それをテストする方法と、使用する終了コードをテストする方法が必要です。どうすればこれを行うことができますか?Microsoft.VisualStudio.TestTools.UnitTesting名前空間を確認しましたが、関連性のあるものは見つかりませんでした。

[TestMethod]
[DeploymentItem("myprog.exe")]
public void MyProgTest()
{
    // Want to ensure this Exit's with code 0:
    MyProg_Accessor.myMethod();
}

その間、私がテストしたいコードの要点は次のとおりです。

static void myMethod()
{
    Environment.Exit(0);
}

編集:RichardOD のおかげで、テストメソッドで使用したソリューションは次のとおりです。

Process proc;

try
{
    proc = Process.Start(path, myArgs);
}
catch (System.ComponentModel.Win32Exception ex)
{
    proc = null;
    Assert.Fail(ex.Message);
}

Assert.IsNotNull(proc);
proc.WaitForExit(10000);
Assert.IsTrue(proc.HasExited);
Assert.AreEqual(code, proc.ExitCode);
4

6 に答える 6

5

Environment クラスのラッパーを作成し、そのラッパーをコードで使用する必要があります。単体テストでは、ラッパーのモック バージョンを挿入します。次の例では、RhinoMocks を使用して、メソッドが予想される引数でラッパーを呼び出すことを確認します。

public class EnvironmentWrapper
{
    public virtual void Exit( int code )
    {
        Environment.Exit( code );
    }
}


public class MyClass
{
    private EnvironmentWrapper Environment { get; set; }

    public MyClass() : this( null ) { }

    public MyClass( EnvironmentWrapper wrapper )
    {
        this.Environment = wrapper ?? new EnvironmentWrapper();
    }

    public void MyMethod( int code )
    {
        this.Environment.Exit( code )
    }
}


[TestMethod]
public void MyMethodTest()
{
     var mockWrapper = MockRepository.GenerateMock<EnvironmentWrapper>();

     int expectedCode = 5;

     mockWrapper.Expect( m => m.Exit( expectedCode ) );

     var myClass = new MyClass( mockWrapper );

     myclass.MyMethod( expectedCode );

     mockWrapper.VerifyAllExpectations()
}
于 2009-07-13T19:54:00.503 に答える
4

これは信じられないほど悪い考えのように聞こえます。Environment.Exit(0) は明らかに規定どおりに機能するため、単体テストが壊れているのはなぜですか。

本当にこれをテストしたい場合は、別のプロセスを起動して戻りコードを確認することで、Process.Startでラップすることを確認してください。

別のオプションは、このコードを除外してテスト spyを挿入するか、モック オブジェクトを使用して正しい動作を検証することだと思います。

おそらく、Typemock Isolator を使用して何かを行うことができます。これにより、静的メソッドをモックできると思います。

于 2009-07-13T19:48:52.340 に答える
2

ここでの唯一のオプションは、偽の Exit メソッドを使用して Environment クラスをモックすることです。

于 2009-07-13T19:50:05.457 に答える
0

私の頭に浮かぶ唯一のことは、次のようなものです。

static void myMethod()
{
    DoEnvironmentExit(0);
}

static void DoEnvironentExit(int code)
{
    #if defined TEST_SOLUTION
      SomeMockingFunction(code);
    #else
      Environment.Exit(code);
    #endif
}
于 2009-07-13T19:57:07.957 に答える