6

OK、単体テストを実行して、Exception.Data プロパティに特定の名前付きキーに対する特定の値が含まれているかどうかを確認しています。

Exception.Data は IDictionary 型です。IDictionary には 2 つのオーバーロードしかなく、辞書の内容を確認する方法がわかりません。

例外をスローする次のコードがあります。

public class MyClass
{
    public void ThrowMyException()
    {
        throw new MyException();
    }
}

public class MyException : Exception
{
    public MyException()
    {
        this.Data.Add("MyKey1", 212);
        this.Data.Add("MyKey2", 2121);
    }
}

次に、MyKey1 = 212 および MyKey2 = 2121 であることを確認するためのテスト:

[TestClass]
public class UnitTest1
{
    [TestMethod]
    public void TestMethod1()
    {
        MyClass classUnderTest = new MyClass();

        Action test = () =>
        {
            classUnderTest.ThrowMyException();
        };


        test.ShouldThrow<MyException>() //.And.Data.Keys.Should().Contain("")

    }
}

データに、値が 212 の MyKey1 と値が 2121 の MyKey2 が含まれていることをテストしたいと思います。

4

2 に答える 2

10

キーと値のペアが非ジェネリック に存在するかどうかをテストする場合はIDictionary、オブジェクトを作成し、DictionaryEntryそれが辞書に存在するかどうかを確認する必要があります。

したがって、あなたの場合は次のようになります。

test.ShouldThrow<MyException>().And
    .Data.Should().Contain(new DictionaryEntry("MyKey2", 2121));
于 2016-01-19T15:11:03.277 に答える
1

基本的に、例外への参照を取得し、それで必要なことは何でもする必要があります。それをキャストして、オブジェクトを検証できます。このようなもの:

[TestClass]
public class UnitTest1
{
   [TestMethod]
    public void TestMethod1()
    {
        MyClass classUnderTest = new MyClass();
        Exception ex;
        try
        {
            Action test = () =>
            {
                classUnderTest.ThrowMyException();
            };
        }
        catch (Exception exception)
        {
            ex = exception;
        }


        test.ShouldThrow<MyException>();
        ex.ShouldBeOfType<MyException();
        ((MyException)ex).Data.ShouldContain("MyKey");

    }
}
于 2016-01-19T14:51:56.443 に答える