2012-03-26 5 views
8

Akıcı Değerlendirmeler kullanarak karşılaştırmaya çalıştığım bir çift Listeler var. Bir karşılaştırmayı kolayca kodlayabilirim, ancak Fluent Assertions'ı kullanmak istiyorum, böylece test başarısız mesajında ​​görünme nedenini elde edebilirim. Şu ana kadar gördüğümAkıcı Değerlendirmeler, IEnumerable <string> için bir dizeye duyarsız karşılaştırma kullanabilir mi?

Herşey harf duyarlı varsayılan Object.Equals karşılaştırma kullanarak görünüyor. Bir IComparer'ı Equal'e veya Yöntemlere iletemiyorum, başka bir yolu var mı?

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

cevap

1

Biz Eşit() yöntemine isteğe bağlı bir lambda ifadesi ekleyebilir. Ardından, aynı zamanda mümkün olacağını

[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 gibi bir şey olabilir, ama Equal için ara sıra istisna düşünüyorum() ek bir özel yazılı sınıfını garanti olmaz 'nin öntanımlı davranışı. Aslında, ayrı bir IComparer, testin niyetini asla belirsizleştirebilir. Ne düşündüğünüzü en iyi çözüm olduğunu söyleyeyim, böylece Codeplex'in 1.8.0 sürümü için bir sorun olarak ekleyebilirim. biri şu kullanabilirsiniz FluentAssetrions sonraki sürümlerinde

+0

Bu tam olarak istediğim gibi. Şimdilik aşağıdaki geçici çözümlerden birini kullanacağım ve bir sonraki versiyona göz kulak olacağım. – Zugbo

+0

http://fluentassertions.codeplex.com/workitem/11925 –

+0

adresindeki talep eklendi. Önerilen çözüm, şimdi bagajda uygulanacak ve yeni sürüm 2.0.0'ın bir parçası olacak. –

0

((bu ben bu şeyleri yaparız) kendiniz IEnumerable<string> için bir uzantı yöntemi wirte edebileceğini ve bazı Birim-Testframeworks zaten bunu ben şey (FSUnit AFAIK) İşte

basit bir örnek size çok artırabilirsiniz -

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

gibi kullanın) ancak yapmalıyım

actual.AssertEqualSetCaseInsensitive(expected); 
+1

"Kolaylıkla bir karşılaştırmayı kodlayabilirim, ancak Fluent Assertions'ı kullanmak istiyorum" – bzlm

+0

Kod yazmam gerekirse, muhtemelen böyle yapardım, ama ideal olarak birisi bana gösterecek Henüz kütüphanede görmediğim bir yöntem. – Zugbo

1

Bir genişletme yöntemi (veya iki) ile yeni bir Akıcı iddia ekleme hakkında ne dersiniz? Bir dizi koleksiyon için mevcut akıcı iddialara bir .EqualInsensitively(...) eklemek için kod yazdım.

ben onun biraz uzun ve MS-PL CC-Wiki ile uyumlu olmayabilir çünkü an external pastebin bu uygulamaya kodu koyduk. Böyle

Kullanım şey:

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

pastebin bağlantısı 404s –

15

: Kullandığım sürüm

// 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 (FluentAssertions.2.2.0.0): [meta veri] den

stringValue.Should().BeEquivalentTo(stringToCompare); 

özeti.

İlgili konular