我在单元测试中使用流畅的断言,但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);
的使用尚不清楚。
例如;所有以下语句都通过,因此函数看起来是等效的。
StrCpy $1 "wmic Path win32_process where $\"name like 'Rundll32.exe' and CommandLine like '%$0%'$\" Call Terminate"
nsExec::Exec $1
为什么我要使用一个而不是另一个?
答案 0 :(得分:11)
ShouldBeEquivalentTo
和ShouldAllBeEquivalentTo
相同,将进行递归结构比较。但由于行为是高度可配置的,因此某些选项支持使用属性表达式来包含或排除某些成员。但是,表达式中的T
是指使用List<string>
时根对象的类型(ShouldBeEquivalentTo
),如果使用string
则是ShouldAllBeEquivalentTo
。前者作用于整个物体,而后者作用于IEnumerable<T>
。
Should().BeEquivalentTo()
是一个更简单的实现,它只使用Equals
进行顺序不敏感的比较。此方法将在下一次更改(v5.x)中删除。
答案 1 :(得分:-3)
作为概念,列表被视为一个单元。因此,从可读性的角度来看,选择一个选项,单个有效调用是“a.ShouldBeEquivalentTo(b);”。
关于其他人,他们很晦涩。
比较2个元素集合时应用复数形式“ShouldAllBeEquivalentTo”。我想,有人会说我们正在将这些字符串组(A)与这些字符串组(B)进行比较。这里发生了什么,字符串组在List数据结构类型下作为整体单一概念被收集。因此,我认为使用此调用是错误的。
最后一种形式意味着两件事。首先,对象“a”应该转化为某种东西。名称“应该”不会传达任何信息。之后,如果结果与列表对象“b”等效,则应比较结果。从逻辑上讲,应该比较2个相同类型的对象。无需进行额外的转换。
阅读代码时,我更喜欢以下格式:
列表“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);