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

Posted

技术标签:

【中文标题】Fluent Assertion - 比较忽略空值的模型属性【英文标题】:Fluent Assertion - compare models properties ignoring null values 【发布时间】:2021-04-30 11:04:48 【问题描述】:

我正在处理的案例是 - 比较两个具有属性的对象但不包括具有空值的成员的最佳解决方案。

例如

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

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

objectA.Should().BeEquivalentTo(expectedObjectB);

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

【问题讨论】:

【参考方案1】:

解决此问题的一种方法是使用匿名对象。 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);

【讨论】:

但是null值的属性可以不一样,有时候是prop1,有时候是prop2,甚至有时候两者都是 这对我来说听起来很模糊。【参考方案2】:

好的,我通过自定义 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())
);

【讨论】:

以上是关于Fluent Assertion - 比较忽略空值的模型属性的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Fluent Assertion 比较两个因属性而异的集合?

如何检查是不是可以在 Fluent Assertion 中使用 ContainValue 验证类型类的字典

Hive 忽略空值

在 Fluent 断言中排除未初始化 (null) 的属性

Fluent NHibernate 忽略 ClassMap 中的属性,使用 FluentMappings

为啥 Fluent NHibernate 会忽略我对组件的唯一约束?