xUnit: Assert two List <T> เท่ากับ?


109

ฉันยังใหม่กับ TDD และ xUnit ดังนั้นฉันจึงต้องการทดสอบวิธีการของฉันที่มีลักษณะดังนี้:

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

มีวิธีการยืนยันที่ฉันสามารถใช้ได้หรือไม่? ฉันคิดว่าอะไรแบบนี้น่าจะดี

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

มีแบบนี้ด้วยเหรอ?

คำตอบ:


139

xUnit.Netรู้จักคอลเลกชันดังนั้นคุณต้องทำ

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

คุณสามารถดูการยืนยันคอลเลกชันอื่น ๆ ที่มีอยู่ในCollectionAsserts.cs

สำหรับวิธีการเปรียบเทียบคอลเลคชันNUnitไลบรารีคือ

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

และ

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

รายละเอียดเพิ่มเติมที่นี่: CollectionAssert

MbUnitยังมีการยืนยันคอลเลกชันที่คล้ายกับ NUnit: Assert.Collections.cs


1
เปลี่ยนลิงก์ซอร์สโค้ด
Julien Roncaglia

1
ลิงก์ใหม่ในความคิดเห็นก็เสียเช่นกัน
Scott Stafford

1
ตอนนี้โปรเจ็กต์ถูกย้ายไปที่ GitHub แล้ว แต่ฉันไม่สามารถหาซอร์สไฟล์นั้นได้
MEMark

1
สำหรับวัตถุที่ซับซ้อนอย่าลืมว่าคุณต้องมี Equal + GetHasCode เพื่อให้ใช้งานได้หรือให้ EqulityComparer แบบกำหนดเองให้เมธอด Equal
maracuja-juice

3
วิธี xUnit Equal จะคืนค่าเท็จสำหรับ IEnumerables สองรายการที่มีเนื้อหาเท่ากัน
Vladimir Kocjancic

31

ใน XUnit เวอร์ชันปัจจุบัน (1.5) คุณสามารถใช้ได้

Assert.Equal (คาดว่าจะเกิดขึ้นจริง);

วิธีการข้างต้นจะทำการเปรียบเทียบองค์ประกอบโดยการเปรียบเทียบองค์ประกอบของทั้งสองรายการ ฉันไม่แน่ใจว่าจะใช้ได้กับเวอร์ชันก่อนหน้าหรือไม่


9
ปัญหาที่ฉันพบใน Assert ความเท่าเทียมกันสำหรับคอลเลกชันคือมันล้มเหลวหากองค์ประกอบของคอลเลกชันอยู่ในลำดับที่ต่างกันแม้ว่าองค์ประกอบจะมีอยู่ในทั้งสองอย่างก็ตาม
Scott Lawrence

1
@ ScottA.Lawrence Lists มีคำสั่งด้วย! คุณมีพฤติกรรมเดียวกันกับ HashSets หรือไม่?
johv

@johv ฉันยังไม่ได้ทดสอบกับ HashSets แต่นั่นเป็นความคิดที่ดี เมื่อได้มีโอกาสลองแล้วจะพยายามจำตอบที่นี่
Scott Lawrence

2
นอกจากนี้ดูเหมือนว่าจะล้มเหลวหากประเภทของคอลเลกชันต่างกันแม้ว่าทั้งสองจะมีรายการเดียวกันในลำดับเดียวกันก็ตาม
James White

3
แต่มันมีผลลัพธ์ที่เส็งเคร็งมาก ไม่ได้บอกคุณว่าสองรายการแตกต่างกันตรงไหน! :(
Zordid

17

ด้วย xUnit คุณควรต้องการคุณสมบัติการเลือกเชอร์รี่ของแต่ละองค์ประกอบเพื่อทดสอบคุณสามารถใช้ Assert.Collection

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

ซึ่งจะทดสอบจำนวนที่คาดไว้และตรวจสอบว่าการดำเนินการแต่ละอย่างได้รับการยืนยัน


2

เมื่อเร็ว ๆ นี้ฉันใช้xUnit 2.4.0และMoq 4.10.1แพ็กเกจในแอป asp.net core 2.2 ของฉัน

ในกรณีของฉันฉันจัดการเพื่อให้มันทำงานได้ด้วยกระบวนการสองขั้นตอน:

  1. การกำหนดการใช้งาน IEqualityComparer<T>

  2. ส่งอินสแตนซ์ตัวเปรียบเทียบเป็นพารามิเตอร์ที่สามไปยังAssert.Trueเมธอด:

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

แต่มีอีกวิธีที่ดีกว่าในการรับผลลัพธ์เดียวกันโดยใช้แพ็คเกจFluentAssertions ช่วยให้คุณสามารถทำสิ่งต่อไปนี้:

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

น่าสนใจที่Assert.Equal()มักจะล้มเหลวแม้ว่าฉันจะสั่งองค์ประกอบของสองรายการเพื่อให้อยู่ในลำดับเดียวกัน


2
มีบางอย่างผิดปกติกับการสั่งซื้อ BeEquivalentTo ของคุณไม่สนใจคำสั่งซื้อ (นั่นคือเหตุผลที่การทดสอบของคุณผ่านด้วย BeEquivalentTo ไม่ใช่ด้วยการยืนยันเท่ากับ)
RagnaRock
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.