15

我有一对列表,我正在尝试使用 Fluent Assertions 进行比较。我可以轻松地编写比较代码,但我想使用 Fluent Assertions 以便我可以找到出现在测试失败消息中的原因。

到目前为止,我所看到的一切似乎都在使用默认的 Object.Equals 比较,它区分大小写。我似乎无法将 IComparer 传递给 Equal 或 Contains 方法,那么还有其他方法吗?

[TestMethod()]
public void foo()
{
  var actual = new List<string> { "ONE", "TWO", "THREE", "FOUR" };
  var expected = new List<string> { "One", "Two", "Three", "Four" };

  actual.Should().Equal(expected);
}
4

4 回答 4

31

在 Fluent Assertions 的后续版本中,可以使用以下内容:

stringValue.Should().BeEquivalentTo(stringToCompare);

元数据摘要

断言一个字符串与另一个字符串完全相同,包括任何前导或尾随空格,但大小写除外

  • FluentAssertions 2.2.0.0

在我使用的版本中有效。

于 2014-04-07T08:58:50.627 回答
3

我们可以向 Equal() 方法添加一个可选的 lambda 表达式。然后,你可以做类似的事情

[TestMethod()] 
public void foo() 
{ 
   var actual = new List<string> { "ONE", "TWO", "THREE", "FOUR" }; 
   var expected = new List<string> { "One", "Two", "Three", "Four" }; 

  actual.Should().Equal(expected, 
    (o1, o2) => string.Compare(o1, o2, StringComparison.InvariantCultureIgnoreCase))
} 

IComparer 也是可能的,但我认为 Equal() 默认行为的偶尔例外不会保证额外的自定义编写类。事实上,单独的 IComparer 可能会掩盖测试的意图。让我知道你们认为最好的解决方案,所以我可以将它作为 Codeplex 1.8.0 版的问题添加。

于 2012-03-27T06:15:02.767 回答
1

通过扩展方法(或两个)添加新的 Fluent 断言怎么样?我编写了代码来.EqualInsensitively(...)为字符串集合添加可用的流利断言。

我已经把实现这个的代码放在一个外部的 pastebin上,因为它有点长,而且 MS-PL 可能与 CC-Wiki 不兼容。

使用这样的东西:

private static void Main()
{
    var mylist = new List<string> {"abc", "DEF", "GHI"};
    mylist.Should().EqualInsensitively(new[] {"AbC", "def", "GHI"})
      .And.NotContain(string.Empty); //Emaple of chaining
}
于 2012-03-26T20:12:28.160 回答
0

您可以为自己编写一个扩展方法IEnumerable<string>(这就是我做这些事情的方式)并且我认为一些 Unit-Testframeworks 已经这样做了(FSUnit AFAIK)

这是一个简单的例子(你可以改进很多 - 但它应该这样做)

public static AssertEqualSetCaseInsensitive(this IEnumerable<string> actual, IEnumerable<string> expected)
{
   if (actual.Count() != expected.Count())
      Assert.Fail("not same number of elements");

   if (!actual.All(a => expected.Any(e => e.ToLower() == a.ToLower()))
      Assert.Fail("not same sets");
}

就像使用一样

actual.AssertEqualSetCaseInsensitive(expected);
于 2012-03-26T18:42:48.083 回答