xUnit: İki List <T> eşittir?


109

TDD ve xUnit konusunda yeniyim, bu nedenle aşağıdaki gibi görünen yöntemimi test etmek istiyorum:

List<T> DeleteElements<T>(this List<T> a, List<T> b);

Kullanabileceğim herhangi bir Assert yöntemi var mı? Bence böyle bir şey güzel olur

List<int> values = new List<int>() { 1, 2, 3 };
List<int> expected = new List<int>() { 1 };
List<int> actual = values.DeleteElements(new List<int>() { 2, 3 });

Assert.Exact(expected, actual);

Bunun gibi bir şey var mı?

Yanıtlar:


137

xUnit.Net koleksiyonları tanır, bu yüzden yapmanız gereken

Assert.Equal(expected, actual); // Order is important

CollectionAsserts.cs'de diğer kullanılabilir koleksiyon iddialarını görebilirsiniz.

İçin NUnit kütüphane koleksiyonu karşılaştırma yöntemlerdir

CollectionAssert.AreEqual(IEnumerable, IEnumerable) // For sequences, order matters

ve

CollectionAssert.AreEquivalent(IEnumerable, IEnumerable) // For sets, order doesn't matter

Daha fazla ayrıntı burada: CollectionAssert

MbUnit ayrıca NUnit: Assert.Collections.cs'ye benzer koleksiyon onaylarına sahiptir.



1
Yorumlarda da yeni bağlantı koptu.
Scott Stafford

1
Proje şimdi GitHub'a taşındı, ancak o belirli kaynak dosyasını da orada bulamadım.
MEMark

1
Karmaşık nesneler için, bunun çalışması için bir Equal + GetHasCode'a ihtiyacınız olduğunu unutmayın veya Equal yöntemine özel bir EqulityComparer verin
maracuja-juice

2
xUnit Equal yöntemi, eşit içeriğe sahip iki IEnumerables için false döndürür.
Vladimir Kocjancic

31

XUnit'in (1.5) mevcut sürümünde sadece

Assert.Equal (beklenen, gerçek);

Yukarıdaki yöntem, iki listenin öğe bazında karşılaştırmasını yapacaktır. Bunun önceki herhangi bir sürüm için çalışıp çalışmadığından emin değilim.


8
Koleksiyonlar için Assert.Equal ile karşılaştığım sorun, öğeler her ikisinde de mevcut olsa bile, koleksiyon öğelerinin farklı sıralarda olması durumunda başarısız olmasıdır.
Scott Lawrence

1
@ ScottA.Lawrence Listelerinde de düzen var! HashSets ile aynı davranışı mı elde ediyorsunuz?
johv

@johv HashSets ile test etmedim ama bu iyi bir fikir. Deneme şansım olduğunda burada cevaplamayı hatırlamaya çalışacağım.
Scott Lawrence

2
Koleksiyon türleri farklıysa, her ikisi de aynı sırayla aynı öğeleri içerse bile başarısız görünüyor.
James White

3
Ama çok berbat bir çıktısı var. Size iki listenin nerede farklı olduğunu söylemez! :(
Zordid

17

XUnit ile, test etmek için her elemanın özelliklerini kiraz seçmek isterseniz Assert.Collection kullanabilirsiniz.

Assert.Collection(elements, 
  elem1 => Assert.Equal(expect1, elem1.SomeProperty),
  elem2 => { 
     Assert.Equal(expect2, elem2.SomeProperty);
     Assert.True(elem2.TrueProperty);
  });

Bu, beklenen sayımı test eder ve her eylemin doğrulanmasını sağlar.


2

Son zamanlarda kullanıyordum xUnit 2.4.0veMoq 4.10.1 asp.net core 2.2 uygulamamda paketler .

Benim durumumda iki aşamalı bir süreçle çalışmasını sağlamayı başardım:

  1. Bir uygulamasını tanımlama IEqualityComparer<T>

  2. Karşılaştırma örneğini üçüncü bir parametre olarak Assert.Trueyönteme geçirin :

    Assert.True(expected, actual, new MyEqualityComparer());

Ancak FluentAssertions paketini kullanarak aynı sonucu almanın daha güzel bir yolu daha var . Aşağıdakileri yapmanızı sağlar:

// Assert          
expected.Should().BeEquivalentTo(actual));

İlginç bir şekilde Assert.Equal(), iki listenin öğelerini aynı sırayla almalarını istediğimde bile bu her zaman başarısız oluyor.


2
siparişinizle ilgili bir sorun var BeEquivalentTo siparişi önemsemiyor (bu yüzden testiniz assert.Equal ile değil BeEquivalentTo ile geçiyor)
RagnaRock
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.