Fluent Assertion - 比较忽略空值的模型属性

问题描述

我正在处理的情况是 - 比较两个具有属性但排除具有空值的成员的对象的最佳解决方案是什么。

例如

objectA.prop1 = "value1";
objectA.prop2 = "value2";
objectA.prop3 = "value3";

expectedobjectB.prop1 = null;
expectedobjectB.prop2 = "value2";
expectedobjectB.prop3 = null;

objectA.Should().BeEquivalentTo(expectedobjectB);

它一对一地比较所有属性在这种情况下如何让它只比较 prop2 而忽略其他? 我应该使用排除方法吗?

解决方法

解决这个问题的一种方法是使用匿名对象。 BeEquivalentTo 在进行结构等效比较时,着眼于决定要考虑哪些属性的期望。

在这个

class MyClass
{
    string Prop1 { get; set; }
    string Prop2 { get; set; }
}

var subject = new MyClass
{
    Prop1 = "IrrelevantValue",Prop2 = "value2"
}


var expected = new
{
    Prop2 = "value2"
}

objectA.Should().BeEquivalentTo(expected);

,

好的,我通过自定义 IEquivalencyStep 获得了它。

public class NullValueExcludingComparer : IEquivalencyStep
    {
        public bool CanHandle(IEquivalencyValidationContext context,IEquivalencyAssertionOptions config)
        {
            return context.Expectation is null;
        }

        public bool Handle(IEquivalencyValidationContext context,IEquivalencyValidator parent,IEquivalencyAssertionOptions config)
        {
            return true;
        }
    }

并执行:

objectA.Should().BeEquivalentTo(expectedObjectB,options =>
    options.Using(new NullValueExcludingComparer())
);