9

我在单元测试中使用流利的断言,但是 , 和 的使用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);

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

4

2 回答 2

12

ShouldBeEquivalentTo并且ShouldAllBeEquivalentTo是相同的,并且将进行递归结构比较。但由于行为是高度可配置的,一些选项支持使用属性表达式来包含或排除某些成员。但是,T表达式中的 in 指的是根对象 ( List<string>)的类型,ShouldBeEquivalentTo使用时和使用stringif ShouldAllBeEquivalentTo。前者作用于整个对象,而后者作用于IEnumerable<T>

Should().BeEquivalentTo()是一个更简单的实现,它只会使用Equals. 此方法将在下一次重大更改 (v5.x) 中删除。

于 2016-01-06T17:35:22.243 回答
-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);
于 2015-12-19T15:12:16.467 回答