ShouldBeEquivalentTo导致对象引用未设置ExcludeMissingProperties的异常/定义

时间:2014-03-25 21:09:48

标签: c# unit-testing nullreferenceexception fluent-assertions

摘要:在使用Fluent断言编写单元测试时,我遇到了几个问题,我已在下面详细介绍过。如果您需要我的任何其他信息,请告诉我,但我不确定这是否确实是预期的行为或我误解了什么。

问题1是未设置为我正在观察的实例异常的对象引用。与定义ExcludeMissingProperties的方式相比,问题2是一种看似意外的行为。

对于下面的问题,我使用以下示例类来帮助演示我正在讨论的问题。

public class B
    {
        public string Name { get; set; }

        public int Id { get; set; }
    }

internal class BTo
    {
        internal int Id { get; set; }

    }

public class C
    {
        public int ID { get; set; }
        public B B { get; set; }
    }

问题1:当期望没有设置复杂类型属性时,对象引用未设置为实例异常。

一个。如果预期对象(期望)未设置复杂类型属性,并且实际(主题)不设置,则不会将对象引用设置为抛出实例错误。这对于简单对象可能没问题,但是在DTO严重嵌套的实际测试场景中,很难找到导致异常的原因。

湾与此异常相关,如果我们可以抛出导致异常的属性的名称,那将非常有用。我知道这是一个未经处理的场景。

样品测试:

var expected = new C
                {
                    ID = 1,
                };
 var actual = new C
                {
                    ID = 1,
                    B = new B
                        {
                            Id = 1,
                            Name = "name"
                        }
                };
actual.ShouldBeEquivalentTo(expected, expr => expr.ExcludingMissingProperties());

问题2:ExcludingMissingProperties的定义 我不得不编写大量代码来解决默认行为。

对于我的很多测试用例,我不想设置期望属性;例如:数据库插入场景,我想检查是否生成了主键(因此值不应该是默认值是足够的情况),但我并不关心值是什么。同样,还有其他与我的测试用例无关的噪声属性。

所以这失败了:

var expected = new B { Name = "somevalue"};
var actual = new B { Id = 1, Name = "somevalue" };

actual.ShouldBeEquivalentTo(expected, x => x.ExcludingMissingProperties());

通过:

var expected = new BTo { Id = 1};
var actual = new B { Id = 1, Name = "somevalue" };

actual.ShouldBeEquivalentTo(expected, e => e.ExcludingMissingProperties());

1 个答案:

答案 0 :(得分:0)

问题1 已在即将发布的v3.0(现在为alpha版)中得到解决,并且是由null对象引起的。
可以使用Excluding方法使用指向要排除的属性的属性路径表达式来解析问题2 。如果您无法使用该表达式,您还可以使用Excluding的重载需要Func<ISubjectInfo, bool>