【问题标题】:Assert anonymous object equivalence断言匿名对象等价
【发布时间】:2022-05-01 16:09:11
【问题描述】:

我确定我错过了明显的...

假设我们有:

[Fact]
public void SomeTest()
{
    var a = new { SomeProp = "hello", AnotherProp = 9 };
    var b = new { SomeProp = "hello" };
    var c = new { AnotherProp = 9 };
    var d = new { SomeProp = "hello", AnotherProp = 9 };
}

检查所有属性是否匹配的正确断言是什么(例如 ad 将返回 true,但所有其他组合将返回 false?

目前,我正在做等效性检查,但必须双向进行吗?例如

    a.Should().BeEquivalentTo(d);
    d.Should().BeEquivalentTo(a);

如果文档中明确定义了这一点,请原谅我......我找不到它:/

【问题讨论】:

  • 除非我误解了您的问题,否则a.Should().BeEquivalentTo(d); 就是这样做的。
  • 这只检查d 的属性在a 中是否具有匹配的属性。但它不会反过来检查。试试看,你会发现`a.Should().BeEquivalentTo(b);`和`a.Should().BeEquivalentTo(c);`也通过了

标签: c# .net-core .net-standard fluent-assertions


【解决方案1】:

来自微软文档:

因为匿名类型的 Equals 和 GetHashCode 方法是 根据 Equals 和 GetHashCode 方法定义 属性,相同匿名类型的两个实例仅当 它们的所有属性都是平等的。

我不确定 .BeEquivalentTo 的细节,但如果它依赖于 == 运算符,则不能保证匿名类型的平等。

如果匿名对象具有完全相同的结构(包括顺序)和相同的值,您可以使用:

`Assert.True(a.equals(d))

否则,您必须手动声明每个属性

Assert.IsEqual(a.name, d.name); 
Assert.IsEqual(a.AnotherProp, d.AnotherProp)

编辑:您不能使用哈希码来保证两个 dispret 对象的相等性。请参阅 MS 文档中的以下内容:

相等的两个对象返回相等的哈希码。然而, 反过来是不正确的:相等的哈希码并不意味着对象 相等,因为不同的(不相等的)对象可以有相同的哈希 代码

【讨论】:

  • Assert.IsEqual(a.getHashCode(), d.getHashCode()) - 这将不是工作。对于不同的值,哈希码可以相同(这就是为什么您需要覆盖 GetHashCodeEquals 以使用字典中的类型,顺便说一句)。有关一些讨论(互联网上有很多),请参阅this
  • 有趣的是,我确实记得文档中的以下内容:“两个相等的对象返回相等的哈希码。但是,相反的情况并非如此:相等的哈希码并不意味着对象相等,因为不同的(不相等的)对象可以具有相同的哈希码”。我误解了我在上面的答案中发布的文档部分,并将进行适当的编辑。
【解决方案2】:

这是设计使然,从名称上应该是不言自明的。

例如。如果你说“A应该等价于B”,你就是不是说A和B一样,也不是说B等价于A。

【讨论】:

    猜你喜欢
    • 2022-04-20
    • 1970-01-01
    • 2016-03-04
    • 1970-01-01
    • 2019-03-28
    • 2021-12-04
    • 2022-07-23
    • 1970-01-01
    • 2022-01-04
    相关资源
    最近更新 更多