使用`ShouldBeEquivalentTo`,`ShouldAllBeEquivalentTo`和`BeEquivalentTo`

时间:2015-12-19 14:31:51

标签: c# unit-testing fluent-assertions

我在单元测试中使用流畅的断言,但ShouldAllBeEquivalentToBeEquivalentToList<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

为什么我要使用一个而不是另一个?

2 个答案:

答案 0 :(得分:11)

ShouldBeEquivalentToShouldAllBeEquivalentTo相同,将进行递归结构比较。但由于行为是高度可配置的,因此某些选项支持使用属性表达式来包含或排除某些成员。但是,表达式中的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);
相关问题