質問

ようにしていきC#ユニットテストVS2008年のユニットテストの枠組みと方法をいた話 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);
役に立ちましたか?

解決

この音のように不足しています。環境です。Exit(0)は、明らかになりの規定のとってユニットカーや試作車の製作をしてきます。

まだ試験できるようになり、立ち上げ、別の工程などの確認を返しコードしてい包装しましょう ます。開始.

思いの他のオプションを織り込んでこのコード行に注入す 試験パ, し、又は使用を模擬オブジェクトの検証に正しい行動である。

もしかできないものをTypemockアイソレータ-と思うことができます モックにおける静的メソッド.

他のヒント

あなたは、あなたのコード内でラッパーを使用し、その後、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()
}

あなたはこれをテストすることはできません - Environment.Exit には、アプリケーションを完全に殺します。これは、このコードを使用するすべてのAppDomainが、それは本番アプリケーションやユニットテストフレームワークであるかどうか、完全にアンロードされることを意味します。

ここにあなたの唯一のオプションは、fakie終了方法でEnvironmentクラスをモックすることです。

あなたはそれを終了()メソッドが終了していないだろう偽の環境を渡すためにあなたの方法に引数を追加することができます。

あなたは、このパラメータ化メソッドをアプリケーションから呼び出されるメソッド、およびユニットテスト抽出機能から抽出することができます。そのように、あなたはあなたのアプリケーションを変更する必要はありません。

私の心に来るだけの事はあるに沿って何かます:

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

static void DoEnvironentExit(int code)
{
    #if defined TEST_SOLUTION
      SomeMockingFunction(code);
    #else
      Environment.Exit(code);
    #endif
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top