8

しばらくの間、NUnitとVisualStudioを使用してC#.NETコードを記述してきました。例外のテストは、次のスタイルで行われました。

古い構文:

[Test]
[ExpectException(typeof(ExceptionType))] 
public void TestExceptionType()
{

}

現在、NUnitはバージョン2.5.2をリリースしましAssert.Throws( Type expectedExceptionType, TestDelegate code );た。これにより、例外テストがはるかに柔軟になります。例外テストは次のようになります。

新しい構文:

[Test]
public void TestWithNullBufferArgument()
{
   ArgumentNullException ex = Assert.Throws<ArgumentNullException>(() => _testInstance.TestFunction(null));

   // now you can examine the exception and it's properties
   Assert.AreEqual(ex.Message, "Argument was null");
}

私たちの問題は、Assert.Throwsが使用されている場合、NUnit(コンソールまたはGUIランナー)がプログラムのデバッグに使用されているときに、VisualStudioが未処理の例外を示すウィンドウを表示することです。

これを明確にするために、デバッグ時にnunit-x86.exeを実行するように単体テストを含むVSプロジェクトを設定しました。(プロジェクトのプロパティ、デバッグタブを参照してください。開始アクションは、nunit-x86.exeを実行するように設定されています)

これにより、NUnitはテストを続行できなくなります。F5キーを押してデバッグ/単体テストを続行することは可能ですが、これは実行可能な解決策ではありません。

これを回避する方法はありますか?Assert.Throwsの周りにtry...catchブロックを配置すると、デリゲートコードで例外が発生するため、何も実行されません。

誰かがこれに光を当てることができることを願っています。

4

4 に答える 4

7

問題自体が発生するのは、[マイコードのみを有効にする]オプションがオンになっている可能性が高いためです([ツール]->[オプション]->[デバッグ]->[一般]->[マイコードのみを有効にする])。

「この機能を有効にすると、デバッガーはユーザーコード(「マイコード」)のみを表示してステップインし、システムコードや、最適化されているかデバッグシンボルがないその他のコードを無視します」(「[一般]、[デバッグ]、[オプション]ダイアログボックス」を参照) )。

通常、対応するnunit.framework.pdbファイルがないリリースバージョンのnunit.framework.dllがあります。

したがって、2つのオプションがあります。

  1. 「JustMyCode」機能を無効にする

  2. nunitのソースをダウンロードし(http://www.nunit.org/index.php?p=downloadから)、デバッグモードでビルドし、すべてのnunit.framework。*(dll、pdb、xml)をlibまたは他のディレクトリに配置します。ソリューションで、テストプロジェクトでそのnunit.framework.dllを参照します。

お役に立てれば。

于 2010-02-08T19:35:40.720 に答える
2

同じ問題もかなり長い間私を悩ませていました。いくつかのテストを行ったところ、次のことがわかりました。

ライブラリ (この場合は nunit) がデバッグ情報を「none」に設定してコンパイルされている場合、以下のような構成がライブラリで実行され、デリゲートのコードが例外をスローすると、VS はユーザーによって処理されない例外について不平を言うのをやめます。コード。

ライブラリ コード:

public static Exception Throws(TestDelegate code, string message)
{
    Exception caughtException = null;

    try
    {
        code();
    }
    catch (Exception ex)
    {
        caughtException = ex;
    }        

    return caughtException;
}

クライアントコード:

private void btnTest_Click(object sender, EventArgs e)
{
  var ex = MyAssert.Throws(() => { throw new Exception(); }, "");    
}

ライブラリ プロジェクトのデバッグ情報を「none」以外のオプションに設定すると、問題が解決されます。つまり、デバッガーは「未処理」の例外で停止しなくなります。上記のコードを使用して、nunit と自分の手巻きライブラリでテストしました (nunit の Throws メソッドからスニペットを取得しました)。それはVSの機能または「機能」だと思います。

それほど多くのオプションはありません。

  1. 以前に提案されたフィルター例外

  2. 迷惑な停止を避けるために、ローカルで使用するために nunit.framework.dll を再コンパイルします。

その他のオプションとして、MS チームまたは NUnit チーム、またはその両方に連絡して、問題を調査/明確化し、最小限のデバッグ情報で NUnit をコンパイルするよう依頼することもできます。

編集:

もう1つのオプションが見つかりました。

  1. 私の場合、ライブラリがデバッグ情報なしでコンパイルされた場合でも、「モジュールのロード時に JIT 最適化を抑制する」のチェックを外すと、うまくいきます。ただし、プロジェクトがリリース構成で実行されている場合にのみ機能します。
于 2010-02-09T13:25:47.510 に答える
1

あなたは NUnit アサーションに目がくらんでいると思います。単純な try/catch で同じことを達成できます。

try
{
  _testInstance.TestFunction(null);
  Assert.Fail("The method should have thrown...");
}catch{}

これで、必要なものはすべて揃いました。例外がスローされず、通常のコードが期待どおりに例外を処理できる場合、失敗します。

于 2010-02-05T14:55:03.600 に答える
-1

例外を無効にすることで達成できますか。Debug/Exceptions menu を開き、例外を検索します。

于 2010-01-18T15:36:02.357 に答える