Могут ли Fluent Assertions использовать нечувствительное к строке сравнение для IEnumerable <string>? - PullRequest
10 голосов
/ 26 марта 2012

У меня есть пара списков, которые я пытаюсь сравнить, используя 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 ]

24 голосов
/ 07 апреля 2014

В более поздних версиях FluentAssetrions можно использовать следующее:

stringValue.Should().BeEquivalentTo(stringToCompare);

Сводка из [метаданных]:

    // Summary:
    //     Asserts that a string is exactly the same as another string, including any
    //     leading or trailing whitespace, with the exception of the casing.

Работает в версии, которую я использую (FluentAssertions.2.2.0.0).

2 голосов
/ 27 марта 2012

Мы можем добавить необязательное лямбда-выражение в метод Equal ().Затем вы могли бы сделать что-то вроде

[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.

1 голос
/ 27 марта 2012

Как насчет добавления нового утверждения Fluent с помощью метода расширения (или двух)?Я написал код, чтобы добавить .EqualInsensitively(...) к доступным свободным утверждениям для набора строк.

Я поместил код для реализации этого на внешнюю вставку , потому что этонемного долго и 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
}
0 голосов
/ 26 марта 2012

вы можете сами написать метод расширения для 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);
...