【问题标题】:FluentAssertions - Compare equivalency where properties have different names?FluentAssertions - 比较属性具有不同名称的等效性?
【发布时间】:2021-12-18 16:04:31
【问题描述】:

我正在使用 FluentAssertions 来比较映射后对象的等效性:

x.Should().BeEquivalentTo(y);

x 有一个与 y 命名略有不同的属性并不少见,在这种情况下,能够告诉 FluentAssertions 这两个属性的值应该匹配会很棒.理想情况下是这样的:

(y => y.PropertyWithName, x.PropertyWithVerySimilarName)

我正在阅读文档,但看不到明确的方法。有没有人找到办法? https://fluentassertions.com/objectgraphs/

【问题讨论】:

  • x.PropertyWithVerySimilarName.Should().Be(y.PropertyName)?我不明白。你能发布一个更具体的例子或minimal reproducible example吗?
  • 假设类 X 有一个属性“StudentCourseName”,而类 Y 有一个属性“StudentCourseTitle”,比较两个对象的等价性会失败,因为属性有不同的名称,所以 FluentAssertions 不能自动比较等价性。假设我想告诉 FluentAssertions 应该检查这些属性的等价性,是否有内置的方法可以做到这一点?
  • 嗯,首先,如果您有两个包含不同属性的对象,那么您就有了两种完全不同的数据类型。除非您制作自定义相等比较器,否则它们将永远不会被视为相等。其次,Fluent Assertions 中的任何内容,基本上任何其他库中的任何内容都不会对属性名称进行“足够接近”的测试。它们要么完全匹配,要么不匹配。
  • 但是使用 FluentAssertions 来比较两种完全不同的数据类型是很常见的吗?这里的第一个示例是这样做的:fluentassertions.com/objectgraphs
  • 当然,因此我们假设您有一种简单的方法可以在选项中指定特定的比较。

标签: c# fluent-assertions


【解决方案1】:

我会在这里使用Tuples。

只需选择一组“等效于”的属性:

var actual = x
    .Select(item => (item.Prop1, item.Prop2, item.Prop3))
    .ToArray();
var expected = y
    .Select(item => (item.Property1, item.SpecialProp, item.Prop3))
    .ToArray();
actual.Should().BeEquivalentTo(expected);

请记住元组中属性的顺序很重要。

【讨论】:

  • 非常好的解决方案 :) 请记住,元组可能有 8 个元素。
猜你喜欢
  • 2016-10-02
  • 2020-01-20
  • 1970-01-01
  • 2015-09-04
  • 2017-12-27
  • 2015-08-05
相关资源
最近更新 更多