代码之家  ›  专栏  ›  技术社区  ›  Andez

正在检查ShouldThrow异常。.NET中流畅断言中的数据

  •  7
  • Andez  · 技术社区  · 8 年前

    好的,我正在运行一个单元测试,看看是否出现异常。数据属性包含针对特定命名键的特定值。

    例外数据类型为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。

    2 回复  |  直到 8 年前
        1
  •  10
  •   InteXX    2 年前

    如果要测试 键值对 存在于 非通用的 IDictionary ,您需要创建 DictionaryEntry 对象并检查它是否存在于字典中。

    所以在你的情况下,应该是这样的:

    test.Should.Throw<MyException>().And
        .Data.Should().Contain(new DictionaryEntry("MyKey2", 2121));
    
        2
  •  1
  •   InteXX    2 年前

    基本上,你应该得到一个关于你的例外的引用,然后做你需要的任何事情。您可以转换它并验证对象。大致如下:

    [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.Should.Throw<MyException>();
            ex.ShouldBeOfType<MyException();
            ((MyException)ex).Data.ShouldContain("MyKey");
    
        }
    }