Search code examples
c#unit-testingfluent-assertions

Can Fluent Assertions use a string-insensitive comparison for IEnumerable<string>?


I've got a pair of Lists I'm trying to compare using Fluent Assertions. I can code up a comparison easily, but I'd like to use Fluent Assertions so that I can get the reason to show up in the test failed message.

Everything I've seen so far seems to using the default Object.Equals comparison, which is case-sensitive. I can't seem to pass an IComparer to the Equal or Contains methods, so is there any other way?

[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);
}

Solution

  • We could add an optional lambda expression to the Equal() method. Then, you could do something like

    [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))
    } 
    

    A IComparer would also be possible, but I think the occasional exception to Equal()'s default behavior wouldn't warrant an additional custom-written class. In fact, a separate IComparer might ever obscure the intention of the test. Let me know what you guys think is the best solution, so I can add it as an issue on Codeplex for release 1.8.0.