2012-03-26 5 views
8

Mam parę list, które próbuję porównać przy użyciu Fluent Asercje. Mogę łatwo zakodować porównanie, ale chciałbym użyć Fluent Assatesions, aby uzyskać przyczynę pojawienia się w teście nieudanego testu.Czy płynne asercje używają niewrażliwego na ciągi porównania dla IEnumerable <string>?

Wszystko, co widziałem do tej pory, wydaje się używać domyślnego porównania Object.Equals, w którym rozróżniana jest wielkość liter. Nie wydaje mi się, żeby przekazać narzędzie IComparer do metod Equal lub Contains, więc czy istnieje jakiś inny sposób?

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

Odpowiedz

1

Moglibyśmy dodać opcjonalny wyrażenia lambda do sposobu równe(). Następnie można zrobić coś takiego

[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 byłoby również możliwe, ale myślę, że od czasu do czasu wyjątku równe() 's domyślne zachowanie nie uzasadniają dodatkowe niestandardowe napisany klasę. W rzeczywistości oddzielny program IComparer może ukryć zamiar testu. Daj mi znać, co uważasz, że jest najlepszym rozwiązaniem, więc mogę dodać go jako problem w Codeplex dla wersji 1.8.0.

+0

To dokładnie to, czego chciałem. Na razie skorzystam z jednego z poniższych sposobów obejścia i będę mieć oko na tę kolejną wersję. – Zugbo

+0

Dodano żądanie pod adresem http://fluentassertions.codeplex.com/workitem/11925 –

+0

Proponowane rozwiązanie jest teraz zaimplementowane w bagażniku i będzie częścią przyszłej wersji 2.0.0. –

0

można wirte metodę rozszerzenia dla IEnumerable<string> siebie (jest to jak zrobić te rzeczy), a ja co jakiś Unit-Testframeworks już zrobić (FSUnit AFAIK)

Oto prosty przykład (ty mogłyby poprawić wiele - ale powinna to zrobić)

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

wystarczy użyć jak

actual.AssertEqualSetCaseInsensitive(expected); 
+1

"Mogę łatwo zakodować porównanie, ale chciałbym użyć Fluent Assosions" – bzlm

+0

Jeśli muszę napisać kod, to prawdopodobnie tak, jak bym to zrobił, ale najlepiej ktoś mi pokaże jakiejś metody, której jeszcze nie widziałem w bibliotece. – Zugbo

1

Co powiesz na dodanie nowej asercji Fluent za pomocą metody rozszerzenia (lub dwóch)? Napisałem kod, aby dodać .EqualInsensitively(...) do dostępnych asercji płynnych dla zbioru ciągów.

Umieściłem kod, aby zaimplementować to na an external pastebin, ponieważ jest trochę długi i MS-PL może nie być kompatybilny z CC-Wiki.

użyć czegoś takiego:

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 
} 
+2

link do pastebin 404s –

15

W późniejszych wersjach FluentAssetrions można stosować następujące:

stringValue.Should().BeEquivalentTo(stringToCompare); 

Streszczenie z metadanych []:

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

Works w wersji że używają (FluentAssertions.2.2.0.0).

Powiązane problemy