忽略 ShouldBeEquivalentTo 中的内部属性
Posted
技术标签:
【中文标题】忽略 ShouldBeEquivalentTo 中的内部属性【英文标题】:Ignore internal properties in ShouldBeEquivalentTo 【发布时间】:2017-06-05 16:35:09 【问题描述】:有没有办法在做 ShouldBeEquivalentTo 时忽略类的内部属性?
例如,在下面的类中,我想从对象图比较中排除 MetaData 属性。
public class SomeObject
Public string SomeString get; set;
internal MetaData MetaData get; set;
我宁愿不使用
someObject.ShouldBeEquivalentTo(someOtherObject, options =>
options.Excluding(info => info.SelectedMemberPath == "MetaData")
因为我可能有超过 1 个内部属性,并且为所有这些属性设置它会很乏味。
【问题讨论】:
【参考方案1】:FluentAssertions 库中有IMemberSelectionRule
接口:
表示一个规则,该规则定义在比较两个对象的结构相等性时要包括哪些被测对象的成员。
实现此接口允许一次排除所有 internal 属性(其中IsAssembly
属性为true
):
internal class AllExceptNonPublicPropertiesSelectionRule : IMemberSelectionRule
public bool IncludesMembers
get return false;
public IEnumerable<SelectedMemberInfo> SelectMembers(
IEnumerable<SelectedMemberInfo> selectedMembers,
ISubjectInfo context,
IEquivalencyAssertionOptions config)
return selectedMembers.Except(
config.GetSubjectType(context)
.GetNonPrivateProperties()
.Where(p => p.GetMethod.IsAssembly)
.Select(SelectedMemberInfo.Create));
现在可以在单元测试中使用该规则:
someObject.ShouldBeEquivalentTo(someOtherObject, options => options.Using(
new AllExceptNonPublicPropertiesSelectionRule()));
【讨论】:
以上是关于忽略 ShouldBeEquivalentTo 中的内部属性的主要内容,如果未能解决你的问题,请参考以下文章
使用 ShouldBeEquivalentTo 时如何排除 IEnumerable 中所有项目的属性?
ShouldBeEquivalentTo 的 C# Fluent Assertions 全局选项
Fluentassertions.ShouldBeEquivalentTo 中的 Ignoredatamember
为啥 FluentAssertions ShouldBeEquivalentTo 验证内部?