导致对象引用不设置异常/定义ExcludeMissingProperties

本文关键字:定义 ExcludeMissingProperties 异常 设置 对象引用 | 更新日期: 2023-09-27 17:53:30

摘要:在使用Fluent断言编写单元测试时,我遇到了几个问题,我将在下面详细描述。请让我知道,如果你需要任何额外的信息从我,但我不确定这是否确实是预期的行为或我误解了一些东西。

Issue 1是一个对象引用,没有设置为我正在观察的实例异常。问题2是一个与excludemmissingproperties的定义方式相比似乎出乎意料的行为。

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

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大量嵌套的实际测试场景中,很难找到导致异常的原因。

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

样本测试:

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());

Issue 2: ExcludingMissingProperties的定义我必须编写大量代码来处理默认行为。

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

所以这个失败了:

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());

导致对象引用不设置异常/定义ExcludeMissingProperties

问题1已在即将到来的v3.0(现在在alpha)中得到解决,该问题是由null对象引起的。
问题2可以通过使用指向要排除的属性的属性路径表达式的Excluding方法来解决。如果不能使用表达式,也可以使用超载的ExcludingFunc<ISubjectInfo, bool>