Может ли Fluent Assertions использовать нечувствительное к строке сравнение для IEnumerable‹string›?

У меня есть пара списков, которые я пытаюсь сравнить с помощью 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);
}

person Zugbo    schedule 26.03.2012    source источник


Ответы (4)


Мы могли бы добавить необязательное лямбда-выражение в метод 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.

person Dennis Doomen    schedule 27.03.2012
comment
Это примерно то, что я хотел. Сейчас я буду использовать один из обходных путей ниже и буду следить за следующей версией. - person Zugbo; 27.03.2012
comment
Предлагаемое решение теперь реализовано в магистрали и станет частью предстоящего релиза 2.0.0. - person Dennis Doomen; 22.04.2012
comment
Сейчас он находится в общедоступной бета-версии fluentassertions.codeplex.com/releases/view/82423. - person Dennis Doomen; 25.08.2012

В более поздних версиях 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).

person TarasB    schedule 07.04.2014

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

Я поместил код для реализации этого во внешнюю папку для вставки, потому что она немного длинная и 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
}
person Kevin Cathcart    schedule 26.03.2012
comment
ссылка pastebin 404s - person Damian Green; 07.07.2016

вы могли бы написать метод расширения для IEnumerable<string> самостоятельно (вот как я это делаю), и я думаю, что некоторые фреймворки Unit-Test уже делают это (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);
person Random Dev    schedule 26.03.2012
comment
Я могу легко закодировать сравнение, но я хотел бы использовать Fluent Assertions - person bzlm; 26.03.2012
comment
Если мне нужно написать код, я, вероятно, сделаю это так, но в идеале кто-нибудь покажет мне какой-нибудь метод, которого я еще не видел в библиотеке. - person Zugbo; 26.03.2012