用NUnit测试动态属性的正确方法

本文关键字:方法 属性 NUnit 测试 动态 | 更新日期: 2023-09-27 18:08:57

在NUnit中编写测试,似乎会直接测试动态对象上是否存在属性。

Assert.That(() => { var x = aDynamic.expectedProperty; }, Throws.Nothing);

然而,在测试相反的情况下,我遇到了一个难题。

Assert.That(() => { var x = aDynamic.unexpectedProperty; }, Throws.TypeOf<RuntimeBinderException>());

这抛出了一个NUnit.Framework.AssertionException,而我期待一个RuntimeBinderException,尽管我如何试图减轻这种情况,它永远不会成功与特定的异常。

Assert.That(
    () =>
    {
        try
        {
            var x = aDynamic.unexpectedProperty;
        }
        catch (RuntimeBinderException ex)
        {
            throw ex;
        }
        catch (Exception ex)
        {
            //do nothing
        }
    },
    Throws.TypeOf<RuntimeBinderException>());

用NUnit测试动态属性的正确方法

NUnit 3有一个Has.Property语法,比测试是否抛出异常要容易得多。例如,下面是一个简单的测试,用于测试属性

是否存在。
[Test]
public void DynamicPropertyTest()
{
    dynamic dyn = new
    {
        Name = "Rob",
        Country = "Canada"
    };
    Assert.That(dyn, Has.Property("Name"));
    Assert.That(dyn, Has.No.Property("Age"));
}