我肯定我错过了明显的…
假设我们有:
[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 };
}
检查所有属性匹配(例如,a
和d
将返回真,但所有其他组合将返回假)的正确断言是什么?
目前,我正在做等效性检查,但必须在两个方向上都做吗?例如
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。