5

メソッドから特定の例外がスローされるかどうかを判断するために NUnit の Assert.Throws を使用したと断言できたかもしれませんが、私の記憶は以前に失敗しましたSO でこの投稿を読みましたが、正しい構文を知っているため、私の質問には答えませんでした。また、返される例外については何もしたくありません (例外のただし、これは後で役立つ可能性があります)。

Dictionary の使い方を理解していないことを証明するために単体テストを作成しましたが、スローされる KeyNotFoundException を処理できませんでした。NUnit がそれをキャッチしてテストに合格する代わりに、実行時に未処理の KeyNotFoundException エラーが発生します。スローされた .NET 例外で中断するように VS IDE が設定されていないことを確認しました。

私はこの2つの方法を試しました:

Assert.Throws( typeof(KeyNotFoundException), () => value = prefs["doesn't exist"]);

Assert.Throws<KeyNotFoundException>( () => value = prefs["doesn't exist"]);

ただし、どちらも未処理の例外が発生します。ここで何が欠けていますか?

更新は、他の人がこれを再現できないようです。スクリーンショットは次のとおりです。

代替テキスト

4

4 に答える 4

4

これは古いスレッドですが、Visual Studio の [ツール] -> [オプション] で [マイ コードのみを有効にする] をオフにしてみてください。これにより、デバッガーは役に立ち、例外が飲み込まれる前にコード内の最後の可能なポイントで停止します。

または、少なくともそれは私の理解です。

Enable Just My Code をオフにすると、Assert.Throws は正しく動作するはずです。

于 2011-04-21T23:39:02.900 に答える
2

デバッガーは、例外がユーザー コードによって処理されていないことを示していますが、これは技術的には正しいことです。実演するために、提供されているサンプル テスト sgreeve を使用します。

[Test]
public void demonstrateThatExceptionThrown()
{
    string value;
    Dictionary<string, string> test = new Dictionary<string, string>();
    Assert.Throws(typeof(KeyNotFoundException), () => value = test["h"]);
}

これを実行すると、例外がユーザー コードで処理されないという警告が VisualStudio で表示されます。コールスタックを見ると、次のようなものが表示されます

[External Code]
CodeTests.DLL!CodeTests.MiscTests.demonstrateThatExceptionThrown.AnonymousMethod()
[External Code]
CodeTests.DLL!CodeTests.MiscTests.demonstrateThatExceptionThrown()
[External Code]

デリゲートを指定したため、作成した「AnonymousMethod」内で例外が発生しています。これは、.Net フレームワークによって呼び出されています。例外がフレームワークに戻される前にデリゲートが例外を処理していないため、デバッガーが停止しています。スタックのさらに上のコードで処理される可能性があることは気にしません (おそらく、外部コードが例外を正しく処理することを保証する方法がないためです)。

VisualStudio でこれを処理された例外として認識させるには、次のように、ExpectedException 属性を使用してデリゲートを削除します。

[Test]
[ExpectedException(typeof(KeyNotFoundException))]
public void demonstrateThatExceptionThrown()
{
    string value;
    Dictionary<string, string> test = new Dictionary<string, string>();
    value = test["h"];
}
于 2010-04-27T18:57:34.600 に答える
2

直接的な答えではありませんが、個人的にはテストにタグを付けることを好みます

[ExpectedException(typeof(KeyNotFoundException))]
public Test ShouldDoTheStuff() {

  ...

}

これはうまくいきますか?コード自体に問題はありません。

于 2010-03-05T22:47:16.660 に答える
0

さらに最近更新された回答!

この回答に追加されたコメントでの会話の後、nunitit テスト ランナーがここで問題であると思われます。NUnit GUI または優れた Resharper テスト ランナーを使用して問題なく実行できるため、テストに問題があるとは思いません。

更新された回答

スクリーン ショットを見た後、デバッガーでテストをステップ実行しようとしましたが、未処理の例外に関するまったく同じプロンプトが表示されました。そのエラーを通過し続けると、アサーションの最後に到達したときにテストに合格します。

NUnit GUI または Resharper 4.5 テスト ランナーを使用して非デバッグ モードでテストを実行すると、毎回期待どおりにテストに合格します。

当たり前の質問で申し訳ありませんが、何を使ってテストを実行していますか? つまり、どのテストランナーですか?

私が実行した正確なコードは次のとおりです。

using System;
using System.Collections.Generic;
using NUnit.Framework;

namespace ClassLibrary1
{
    [TestFixture]
    public class DictionaryTest
    {


        [Test]
        public void demonstrateThatExceptionThrown()
        {
            string value;
            Dictionary<string, string> test = new Dictionary<string, string>();
            Assert.Throws(typeof(KeyNotFoundException), () => value = test["h"]);
        }
    }
}
于 2010-03-05T22:45:41.987 に答える