วิธีการตรวจสอบขนาดคอลเลกชันใน xUnit เป็นอย่างไร


112

ฉันมีชุดทดสอบในชุดทดสอบที่มีลักษณะดังนี้:

[Fact]
public void VerifySomeStuff()
{
    var stuffCollection = GetSomeStuff();

    Assert.Equal(1, stuffCollection.Count());
}

การทดสอบนี้ได้ผลตามที่ฉันคาดหวัง แต่เมื่อฉันเรียกใช้ xUnit จะพิมพ์คำเตือน:

คำเตือน xUnit2013: อย่าใช้ Assert.Equal () เพื่อตรวจสอบขนาดคอลเลกชัน

อย่างไรก็ตามไม่มีทางเลือกอื่นที่แนะนำในคำเตือนและการค้นหาโดย Google จะพาฉันไปที่ซอร์สโค้ดใน xUnit สำหรับการทดสอบที่ยืนยันว่ามีการพิมพ์คำเตือนนี้

หากAssert.Equal()ไม่ใช่วิธีที่ถูกต้องในการตรวจสอบความยาวของคอลเลคชันคืออะไร?


เพื่อชี้แจง: ฉันตระหนักดีว่าฉันสามารถ "หลอก" xUnit ไม่ให้ส่งเสียงเตือนนี้ได้โดยการแยกตัวแปรหรือใช้Assert.True(stuff.Count() == 1)แทน หลังเป็นเพียงแฮ็คและก่อนหน้านี้รู้สึกเหมือนว่า xUnit พยายามหลีกเลี่ยงการทำซ้ำหลาย ๆ ครั้งIEnumerable<T>นี่เป็นวิธีที่ผิดที่จะไป (เพราะฉันจะได้รับคำแนะนำเกี่ยวกับคอมไพเลอร์แยกต่างหากหากเป็นปัญหา) และ xUnit ตัวเองไม่ควรต้องประเมินอินพุตมากกว่าหนึ่งครั้ง (อันที่จริงมันอาจจะได้รับอินพุตเดียวกันโดยไม่คำนึงถึงการแยกตัวแปรเนื่องจากวิธีการเรียกใช้ฟังก์ชัน C #)

ดังนั้นฉันไม่เพียง แต่สนใจที่จะลบคำเตือนนั้นออกจากผลลัพธ์ของฉัน คำตอบสำหรับคำถามของฉันยังอธิบายว่าเหตุใดคำเตือนนั้นจึงรวมอยู่ในห้องสมุดตั้งแต่แรกและเหตุใดฉันจึงควรใช้วิธีใดจึงจะดีกว่า


หากคุณเก็บไว้stuffCollection.Count()ในตัวแปรแยกต่างหากและส่งต่อไปยังผู้ยืนยันจะทำให้คุณมีข้อผิดพลาดเดียวกันหรือไม่?
hellyale

คำตอบ:


113

Xunit เสนอการแก้ไขอย่างรวดเร็วสำหรับคำเตือนส่วนใหญ่ดังนั้นคุณควรจะเห็นสิ่งที่คิดว่า "ถูกต้อง"

xunit

ในกรณีของคุณต้องการให้คุณใช้Assert.Singleเนื่องจากคุณคาดหวังว่าจะมีรายการเดียว ถ้าคุณได้เข้าไปยุ่งเกี่ยวกับจำนวนข้อเช่น 412 Countแล้วมันจะไม่ให้คำเตือนเกี่ยวกับการใช้ จะแนะนำให้ใช้เฉพาะในSingleกรณีที่คุณคาดหวังว่าจะมีรายการเดียวหรือEmptyหากคุณคาดว่าจะไม่มีรายการ


6
ขอบคุณที่สมเหตุสมผล FWIW ฉันเห็นสิ่งนี้เมื่อสร้างใน VS Code ซึ่งการดำเนินการด่วนไม่ปรากฏขึ้นดังนั้นการรวมคำแนะนำการแก้ไขในข้อความเตือนจะมีประโยชน์มากกว่านี้
Tomas Aschan

2
@TomasLycken - อา. ใช่มีปัญหาสำหรับที่นี่: github.com/xunit/xunit/issues/1423
vcsjones

5
ฉันไม่ใช่แฟนตัวยงของพฤติกรรมนั้น บางครั้งการนับ 1 เป็นเพียงความบังเอิญและดูเหมือนว่าจะไม่ค่อยแสดงออกในการบังคับใช้การเรียกไปที่. Single () การทดสอบอาจเปลี่ยนไปเพื่อคาดหวังการนับที่แตกต่างกันและดูเหมือนว่าน่ารำคาญที่จะต้องทำการเปลี่ยนแปลงเพื่อเรียกวิธีการที่แตกต่างไปจากเดิมอย่างสิ้นเชิงแทนที่จะเปลี่ยนตัวเลข
vargonian

2
Single นั้นยอดเยี่ยมสำหรับ Item เดียวฉันมี 3 รายการและฉันไม่ต้องการเขียน Assert แบบเต็มคอลเลกชัน xUnit มี Assert.Triple หรือไม่ haha
Pawel Cioch

1
@PawelCioch ตามxunit.net/xunit.analyzers/rules/xUnit2013.htmlพวกเขามีEmpty, SingleและNotEmpty- ถ้าคุณคาดหวังค่าแบบไดนามิก xUnit2013 ไม่ควรทริกเกอร์
mbx

2

ฉันพบว่าสิ่งนี้ทำให้ฉันมีข้อผิดพลาดเดียวกัน:

Assert.Equal(2, vm.Errors.Count());

และการส่งมันหยุดข้อผิดพลาดไม่ให้ปรากฏ

Assert.Equal(2, (int)vm.Errors.Count());

2
ผมค่อนข้างแน่ใจว่านี้เป็นไม่ideomaticวิธี
mbx


-1

ฉันมีปัญหาเดียวกันเมื่อฉันใช้คุณสมบัติ Count ด้านล่างใน xUnit

ใส่คำอธิบายภาพที่นี่

หลังจากนั้นฉันใช้ฟังก์ชัน Count () ในคอลเลกชันมันช่วยแก้ปัญหาของฉันได้


แก้ไขปัญหา แต่คุณยังไม่ได้ใช้ XUnit อย่างที่ควร!
Daniel Eisenreich

8
@DanielEisenreich วิธีที่ถูกต้องในการยืนยันการนับจำนวนเฉพาะถ้ามากกว่า 1 คืออะไร?
SomeGuyOnAComputer

@SomeGuyOnAComputer และอีก 4 upvotes ลืมว่าฉันพูดอะไรฉันหน้าด้านเกินไป ถ้ามันยิ่งใหญ่กว่าคุณก็ไม่มีทางเลือกอื่น
Daniel Eisenreich
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.