1

私は単体テストを書いており、 aDB2Exceptionがスローされるシナリオをシミュレートしたいと考えています。

問題は、パブリック コンストラクターがないため作成できないことです。また、ほとんどの単体テスト フレームワーク (nunit で Rhino Mocks を使用しています) も、それらのスタブを作成できません。

このインタラクションをテストできないということで立ち往生していますか?

(詳細: これは- バージョン 8.1.2.1DB2Exceptionで定義されています)IBM.Data.DB2.dll

4

2 に答える 2

1

私はいくつかの派生クラスがあることを望んDB2Exceptionでいましたが、残念ながら、それは封印されています。これがクラスの説明です。

DB2Exceptionsは明らかに誰かによってスローされるため、おそらくinternalコンストラクターがあります。それを使用するには、リフレクションに頼る必要があります。かつてはMSILを分析してC#コードを生成する.NETリフレクターがありましたが、現在はコストがかかります。ここでいくつかの選択肢を見つけることができます。

于 2013-01-25T23:11:54.260 に答える
1

編集以前の投稿はまったく役に立ちませんでした。これが 2 回目の試みです。これでモックのいくつかの要素を実行したい場合もありますが、コードを確認する必要はありませんが、このアプローチのどの要素が機能し、どの要素が機能しないかはわかりません。とにかく、一般的にキャッチブロックまたは例外をテストしようとするときに私がとるアプローチは次のとおりです。

public class A
{
    public void ExecuteDB2Query(string query, DB2Connection connection)
    {
        try
        {
            // Code for executing the DB2 query
        }
        catch(DB2Exception ex)
        {
            // Catch block you are trying to test
        }
    }

    // Actual method
    public void MyMethod()
    {
        var query = "Select * FROM TableInApplication";
        var connection = new DB2Connection("DATABASE=GOODDB");
        ExecuteDB2Query(query, connection);
    }
}

[Test]
public void MyMethod_CallsExecutDB2Query()
{
    // Test that MyMethod is calling ExecuteDB2Query   
}

// Intentionally pass it bad data to test your catch block
// under the notion that the code that executes in the application 
// will be using the same method and thus the same catch block
[Test]
public void ExecuteDB2Query_Handles_Exception()
{
    var queryString = "Select* FROM NonExistentTable";
    var connection = new DB2Connection("DATABASE=BADDB");
    var aClass = new A();
   Assert.Throws<DB2Exception>(() => aClass.ExecuteDB2Query(queryString, connection));
}

これはこれを処理する最もエレガントな方法ではありませんが、例外をスタブ化できない場合は、コードの責任を分割し、例外をトリガーして各部分を個別にテストすることが、次善の策だと思います。

于 2013-01-25T23:39:28.943 に答える