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

时间:2012-08-31 23:12:21

标签: c# linq reflection .net-4.0 fluent-assertions

在FluentAssertions中,我可以使用AllProperties.But(obj => obj.property_I_do_not_want)从比较断言中删除特定属性,当我知道要忽略的属性的名称时这很好,但在我的情况下我只想忽略单元化属性。现在我愿意忽略一个等于null但是如果有一个解决方案也排除了设置为默认值的原语,那将是非常方便的。

我开始尝试为PropertyAssertions类编写扩展方法,但无法弄清楚如何创建包含IEnumerable<Expression<T>>的{​​{1}}来访问要忽略的每个属性传递给Expression<T>方法。

1 个答案:

答案 0 :(得分:3)

如果您愿意尝试2.0测试版,可以在新的ShouldBeEquivalentTo()API中使用lambda来排除某些属性,如下所示:

subject.ShouldBeEquivalentTo(expected, options =>
    options.Excluding(ctx => ctx.PropertyPath == "Level.Level.Text"));

如果需要,您甚至可以将其封装在自定义规则(实现ISelectionRule的类)中,如下所示:

subject.ShouldBeEquivalentTo(expected, options => 
    options.Using(new ExcludeUninitializedProperties()));

实际上,您甚至可以通过覆盖创建初始选项的工厂方法将其设为特定类型的默认值:

EquivalencyAssertionOptions<TSubject>>.Default = () =>    
    EquivalencyAssertionOptions<TSubject>>.Default.Using(new ExcludeUninitializedProperties())