【问题标题】:Can Fluent Assertions use a string-insensitive comparison for IEnumerable<string>?Fluent Assertions 能否对 IEnumerable<string> 使用不区分字符串的比较?
【发布时间】:2012-04-10 06:46:32
【问题描述】:

我有一对列表,我正在尝试使用 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);
}

【问题讨论】:

    标签: c# unit-testing fluent-assertions


    【解决方案1】:

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

    stringValue.Should().BeEquivalentTo(stringToCompare);
    

    元数据摘要

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

    • FluentAssertions 2.2.0.0

    在我使用的版本中有效。

    【讨论】:

      【解决方案2】:

      我们可以在 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 版的问题添加。

      【讨论】:

      • 这正是我想要的。我现在将使用下面的一种解决方法,我会密切关注下一个版本。
      • 提议的解决方案现已在主干中实施,并将成为即将发布的 2.0.0 版本的一部分。
      【解决方案3】:

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

      我已将实现此的代码放在an external 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
      }
      

      【讨论】:

      • pastebin 链接 404s
      【解决方案4】:

      您可以自己为IEnumerable&lt;string&gt; 编写扩展方法(这就是我做这些事情的方式),而且我认为某些单元测试框架已经这样做了(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);
      

      【讨论】:

      • "我可以轻松编写比较代码,但我想使用 Fluent Assertions"
      • 如果我必须编写代码,这可能是我的做法,但理想情况下,有人会向我展示一些我在库中还没有见过的方法。
      猜你喜欢
      • 2021-03-20
      • 2015-01-07
      • 2013-12-04
      • 2016-08-15
      • 2016-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-31
      相关资源
      最近更新 更多