6

好的,我正在运行单元测试以查看 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

如果要测试非泛型中是否存在键值对,则需要创建一个对象并检查它是否存在于字典中。 IDictionaryDictionaryEntry

所以在你的情况下,它会是这样的:

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 回答