Use of `ShouldBeEquivalentTo`, `ShouldAllBeEquivalentTo`, an
本文关键字:ShouldAllBeEquivalentTo an ShouldBeEquivalentTo of Use | 更新日期: 2023-09-27 18:27:21
我在单元测试中使用流畅的断言,但ShouldBeEquivalentTo
、ShouldAllBeEquivalentTo
和BeEquivalentTo
的使用尚不清楚。
例如;以下所有语句都通过,因此函数看起来是等效的。
List<string> a = new List<string>() { "james", "wood" };
List<string> b = new List<string>() { "james", "wood" };
a.ShouldBeEquivalentTo(b);
a.ShouldAllBeEquivalentTo(b);
a.Should().BeEquivalentTo(b);
为什么我应该使用一个而不是另一个?
ShouldBeEquivalentTo
和ShouldAllBeEquivalentTo
相同,将进行递归结构比较。但是,由于行为是高度可配置的,一些选项支持使用属性表达式来包括或排除某些成员。然而,当使用ShouldBeEquivalentTo
时,表达式中的T
指的是根对象的类型(List<string>
),如果使用ShouldAllBeEquivalentTo
则指的是string
。前者作用于整个对象,而后者作用于CCD_ 11。
Should().BeEquivalentTo()
是一个简单得多的实现,它只需要使用Equals
进行顺序不敏感的比较。此方法将在下一次中断更改(v5.x)中删除。
作为一个概念,列表被视为一个单元。因此,从可读性的角度来看,选择一个选项,单个有效调用是"a.ShouldBeEquivalentTo(b);"。
关于其他人,他们是模糊的。
当比较两个元素集合时,应用复数形式"ShouldAllBeEquivalentTo"。我认为,有人会争辩说,我们正在将这组字符串(A)与这组字符串的(B)进行比较。这里发生的情况是,字符串组作为一个完整的概念收集在List数据结构类型下。因此,我认为使用这种呼吁是错误的。
最后一种形式意味着两件事。首先,对象"a"应该被转换成某种东西。"应该"这个名字没有任何意义。然后,如果结果与列表对象"b"等效,则应进行比较。从逻辑上讲,应该比较两个相同类型的对象。不需要进行额外的转换。
在阅读代码时,我更喜欢以下格式:
列表"A"与另一个列表"B"等价。
List<string> a = new List<string>() { "james", "wood" };
List<string> b = new List<string>() { "james", "wood" };
//creating "IsEquivalentTo" method
bool listsAreEqual = a.IsEquivalentTo(b);
//creating "IsEqualTo" method
listsAreEqual = a.IsEqualTo(b);
//overloading operator ==
listsAreEqual = (a == b);