断言匿名对象等价



我肯定我错过了明显的…

假设我们有:

[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将返回真,但所有其他组合将返回假)的正确断言是什么?

目前,我正在做等效性检查,但必须在两个方向上都做吗?例如

a.Should().BeEquivalentTo(d);
d.Should().BeEquivalentTo(a);
如果这在文档中有明确的定义,请原谅我…我找不到它:/

From microsoft docs:

因为匿名类型的Equals和GetHashCode方法是类的Equals和GetHashCode方法定义的属性中,同一匿名类型的两个实例只有在它们所有的属性都是相等的

我不确定。beequivalentto的细节,但如果它依赖于==操作符,这并不能保证匿名类型的相等性。

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

Assert.True (a.equals (d))

否则必须手动断言每个属性

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

编辑:你不能使用哈希码来保证两个不一致的对象相等。查看以下来自MS文档的内容:

两个相等的对象返回相等的哈希码。然而,反之则不成立:相等的哈希码并不意味着对象相等,因为不同(不相等)的对象可以有相同的哈希值代码

这是设计的结果,从名称上看应该是不言自明的。

。如果你说"A应该等于B",你并不是在说A等于B,也不是在说B等于A。

相关内容

  • 没有找到相关文章

最新更新