ทดสอบว่าคลาสมีแอตทริบิวต์หรือไม่?


104

ฉันกำลังพยายามพัฒนา Test-First เล็กน้อยและฉันกำลังพยายามตรวจสอบว่าชั้นเรียนของฉันถูกทำเครื่องหมายด้วยแอตทริบิวต์:

[SubControllerActionToViewDataAttribute]
public class ScheduleController : Controller

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

คำตอบ:


124

ตรวจสอบว่า

Attribute.GetCustomAttribute(typeof(ScheduleController),
    typeof(SubControllerActionToViewDataAttribute))

ไม่เป็นโมฆะ ( Assert.IsNotNullหรือคล้ายกัน)

(เหตุผลที่ฉันใช้สิ่งนี้มากกว่าIsDefinedคือบ่อยครั้งที่ฉันต้องการตรวจสอบคุณสมบัติบางอย่างของแอตทริบิวต์ด้วย .... )


6
เพื่อตรวจสอบว่าแอตทริบิวต์นั้นมีอยู่หรือไม่ซึ่งโดยปกติแล้วเป็นสิ่งที่จำเป็นสำหรับแอตทริบิวต์ที่ไม่มีพารามิเตอร์ / ไม่มีคุณสมบัติจึงมีราคาถูกกว่าที่จะใช้ IsDefined เนื่องจากจะสืบค้นข้อมูลเมตาและไม่แยกส่วนย่อยและสร้างอินสแตนซ์อ็อบเจ็กต์แอตทริบิวต์
Lasse V.Karlsen

1
เช่นเดียวกับประเด็นที่ IsDefined ถูกกว่า ... แต่ในกรณีส่วนใหญ่ (และโดยเฉพาะการทดสอบหน่วย) คุณไม่น่าจะสังเกตเห็นความแตกต่าง บางทีถ้ามันเป็นรหัสการผลิตที่รัดกุม ...
Marc Gravell

@ Marc- ฉันยอมรับว่าความแตกต่างของประสิทธิภาพอาจไม่สามารถสังเกตเห็นได้ในการทดสอบหน่วย ฉันจะได้รับแอตทริบิวต์หากจำเป็นต้องใช้ซึ่งอย่างที่คุณพูดเป็นสถานการณ์ส่วนใหญ่ ฉันเพิ่งใช้ IsDefined ในกรอบฉันกำลังเขียนเพื่อยกเว้นคอลัมน์ในดรอปดาวน์ของเขตข้อมูลที่เรียงลำดับได้ซึ่งทำงานได้ดีเพราะฉันไม่จำเป็นต้องใช้กับแอตทริบิวต์เอง
RichardOD

เราจะทดสอบวิธีการเดียวกันได้อย่างไร?
Manvinder Singh

81

เช่นเดียวกับที่คุณตรวจหาแอตทริบิวต์ในชั้นเรียน

นี่คือโค้ดตัวอย่างบางส่วน

typeof(ScheduleController)
.IsDefined(typeof(SubControllerActionToViewDataAttribute), false);

ฉันคิดว่าในหลาย ๆ กรณีการทดสอบการมีอยู่ของแอตทริบิวต์ในการทดสอบหน่วยนั้นไม่ถูกต้อง เนื่องจากฉันไม่ได้ใช้ฟังก์ชันตัวควบคุมย่อยของ MVC Contrib ฉันจึงไม่สามารถแสดงความคิดเห็นได้ว่าเหมาะสมหรือไม่ในกรณีนี้


+1 แล้วสังเกตเห็นข้อผิดพลาด ควรเป็น. isDefined (typeof (Type), false);
Alexander Beletsky

@alexanderb คุณพูดถูกแน่นอน ฉันได้อัปเดตคำตอบของฉันแล้ว ฉันต้องไม่ตรวจคำตอบกับคอมไพเลอร์ในเวลานั้น! ขอขอบคุณที่ชี้ให้เห็นข้อผิดพลาด
RichardOD

10
วิธีนี้เร็วกว่าก่อนหน้านี้
Slava

18

นอกจากนี้ยังสามารถใช้ยาสามัญในสิ่งนี้:

var type = typeof(SomeType);
var attribute = type.GetCustomAttribute<SomeAttribute>();

ด้วยวิธีนี้คุณไม่จำเป็นต้องใช้รหัสอื่นtypeof(...)ซึ่งสามารถทำให้โค้ดสะอาดขึ้น


สิ่งนี้ไม่ได้ผลสำหรับฉัน ไหนusing.. ฉันหายไป?

@Scanzy ไม่แน่ใจคุณไม่ได้ใช้ IDE หรือเปล่า? (โดยปกติพวกเขาแนะนำที่ถูกต้องusing) คุณได้รับข้อผิดพลาดอะไร?
Kroltan

1
ตกลงที่นี่ฉันพบว่าGetCustomAttribute<SomeAttribute>วิธีนี้สามารถใช้ได้จาก. NET 4.5 และ IDE ของฉันถูกตั้งค่าเป็น 3.5 ดังนั้นทุกอย่างจึงชัดเจนในตอนนี้

9

ฉันรู้ว่ากระทู้นี้เก่าจริงๆ แต่ถ้ามีใครสะดุดเข้าคุณอาจพบว่าโครงการfluentassertionsสะดวกมากสำหรับการยืนยันแบบนี้

typeof(MyPresentationModel).Should().BeDecoratedWith<SomeAttribute>();
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.