使用 ShouldBeEquivalentTo 时如何排除 IEnumerable 中所有项目的属性?
Posted
技术标签:
【中文标题】使用 ShouldBeEquivalentTo 时如何排除 IEnumerable 中所有项目的属性?【英文标题】:How do I exclude a property of all items in IEnumerable when using ShouldBeEquivalentTo? 【发布时间】:2013-02-27 23:36:05 【问题描述】:在我的 NUnit/FluentAssertions 测试中,我使用以下代码将从系统返回的复杂对象与参考对象进行比较:
response.ShouldBeEquivalentTo(reference, o => o.Excluding(x => x.OrderStatus)
.Excluding(x => x.Id)
.Excluding(x => x.Items[0].Name)
.Excluding(x => x.Items[0].Article)
.Excluding(x => x.ResponseStatus));
然而,这并不是我想要的。我想排除Name
和Article
用于Items
列表中的每个 对象,而不仅仅是第0 个。我该如何实现这个场景?
我查看了documentation 并没有找到解决方案。我错过了什么吗?
【问题讨论】:
【参考方案1】:Excluding() 的重载提供了可用于更高级选择标准的 ISubjectInfo。有了这个重载,您可以执行以下操作:
subject.ShouldBeEquivalentTo(expected, config =>
config.Excluding(ctx => ctx.PropertyPath == "Level.Level.Text"));
【讨论】:
在我的示例中应该如何使用 PropertyPath?我试过 PropertyPath == "Items.Name" 和 "Order.Items.Name" 但它不起作用。 ctx.PropertyPath.EndsWith("].Name") 怎么样 || ctx.PropertyPath.EndsWith("].Article")? 行得通,谢谢。我想,如果我也想匹配集合名称,我应该使用正则表达式。是否有任何文档说明 PropertyPath 在各种情况下的外观? 它看起来完全符合您的预期。例如。项目[0]。名称。您还可以在 CodePlex 上查看原始源代码中的 EquivalencySpecs。我们练习 TDD,因此希望您可以将它们用作一种 API 文档。以上是关于使用 ShouldBeEquivalentTo 时如何排除 IEnumerable 中所有项目的属性?的主要内容,如果未能解决你的问题,请参考以下文章
忽略 ShouldBeEquivalentTo 中的内部属性
ShouldBeEquivalentTo 的 C# Fluent Assertions 全局选项
Fluentassertions.ShouldBeEquivalentTo 中的 Ignoredatamember
NUnit 断言是不是有 ShouldBeEquivalentTo() 替代方案?
FluentAssertions:ShouldBeEquivalentTo vs Should().Be() vs Should().BeEquivalentTo()?