Bir sınıfın bir özniteliği olup olmadığını test etmek?


104

Küçük bir Önce Test geliştirmesi yapmaya çalışıyorum ve sınıflarımın bir öznitelikle işaretlendiğini doğrulamaya çalışıyorum:

[SubControllerActionToViewDataAttribute]
public class ScheduleController : Controller

Sınıfın kendisine atanan özniteliğe sahip olup olmadığını nasıl birim test ederim?

Yanıtlar:


124

Şunu kontrol et

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

boş değil ( Assert.IsNotNullveya benzeri)

(bunu kullanmamın nedeni IsDefinedçoğu zaman özniteliğin bazı özelliklerini de doğrulamak istememdir ....)


6
yalnızca parametresiz / özelliksiz öznitelikler için gereken tek şey olan özniteliğin mevcut olup olmadığını kontrol etmek için, meta verileri sorgulayacağı ve öznitelik nesnesinin serisini kaldırıp başlatmayacağı için .IsDefined'ı kullanmak daha ucuzdur.
Lasse V.Karlsen

1
IsDefined ile ilgili nokta daha ucuz olduğu gibi ... ancak çoğu durumda (ve özellikle birim testlerinde) farkı fark etme olasılığınız düşüktür. Belki üretim kodunda sıkı bir döngü olsaydı ...
Marc Gravell

@ Marc- Performans farkının muhtemelen bir birim testinde fark edilmeyeceği konusunda hemfikirim. Kullanmam gerekirse, özniteliği alırdım, dediğiniz gibi çoğu durumda senaryo. Son zamanlarda IsDefined'ı, sıralanabilir alanların açılır listesindeki bir sütunu hariç tutmak için yazdığım bir çerçevede kullandım - bu, özniteliğin kendisi için kullanmam gerekmediğinden iyi çalıştı.
RichardOD

Bir yöntem için aynısını nasıl test edebiliriz?
Manvinder Singh

81

Normalde bir sınıftaki bir özniteliği kontrol edeceğiniz gibi.

İşte bazı örnek kodlar.

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

Çoğu durumda, bir birim testinde bir niteliğin varlığını test etmek yanlıştır. MVC katkısının alt denetleyici işlevini kullanmadığım için, bu durumda uygun olup olmadığına dair yorum yapamam.


+1 yaptı ve ardından bir hata fark etti. .IsDefined (typeof (Type), false) olmalıdır;
Alexander Beletsky

@alexanderb tabii ki haklısın. Cevabımı şimdi güncelledim. Cevabımı o sırada derleyiciye karşı kontrol etmemeliyim! Hatayı işaret ettiğiniz için teşekkürler
RichardOD

10
bu yaklaşım bir öncekinden daha hızlı
Slava

18

Bununla ilgili jenerik kullanmak da mümkündür:

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

Bu şekilde başka birine ihtiyacınız kalmaz typeof(...), bu da kodu daha temiz hale getirebilir.


Bu benim için çalışmıyor. Hangisini using.. özlüyorum?

@Scanzy Emin değilim, IDE kullanmıyor musunuz? (Genellikle doğru olanı önerirler using) Hangi hatayı alıyorsunuz?
Kroltan

1
Tamam, burada buldum GetCustomAttribute<SomeAttribute>yöntem .NET 4.5 den geniş bir yelpaze olduğunu ve her şeyi artık açıktır yani benim IDE 3.5'e ayarlandı

9

Bu ileti dizisinin gerçekten eski olduğunu biliyorum, ancak biri üzerine rastlarsa, bu tür iddiaları yapmak için akıcı iddialar projesini çok uygun bulabilirsiniz .

typeof(MyPresentationModel).Should().BeDecoratedWith<SomeAttribute>();
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.