2009-08-04 21 views
75

Próbuję zrobić mały test pierwszego rozwoju, a ja staram się zweryfikować, że moje zajęcia są oznaczone atrybutem:Sprawdź, czy klasa ma atrybut?

[SubControllerActionToViewDataAttribute] 
public class ScheduleController : Controller 

Jak to zrobić testów jednostkowych, że klasa ma ten atrybut przypisany do tego?

Odpowiedz

97

Sprawdź,

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

nie jest null (Assert.IsNotNull lub podobny)

(powód Używam tego zamiast IsDefined jest to, że większość czasu chcę potwierdzić niektóre właściwości atrybutu też. ...)

+5

, aby sprawdzić tylko, czy atrybut jest obecny, co jest zwykle wszystkim, co jest potrzebne do atrybutów bez parametrów/właściwości, jest tańszy w użyciu .IsDefined, ponieważ zapyta metadane, i nie deserializować i tworzyć instancji obiektu atrybutu. –

+0

Jak to jest o tym, że IsDefined jest tańszy ... ale w większości przypadków (aw szczególności testów jednostkowych) jest mało prawdopodobne, że zauważy różnicę. Może gdyby to była ciasna pętla w kodzie produkcyjnym ... –

+0

@ Marc- Zgadzam się, że różnica w wydajności prawdopodobnie nie byłaby zauważalna w teście jednostkowym. Dostałbym atrybut, gdybym go potrzebował, co, jak pan twierdzi, jest w większości przypadków scenariuszem. Niedawno użyłem IsDefined w ramce, którą pisałem, aby wykluczyć kolumnę z rozwijanego pola sortowania - to działało dobrze, ponieważ nie musiałem używać tego atrybutu. – RichardOD

54

To samo, co zwykle sprawdza się w przypadku atrybutu klasy.

Oto przykładowy kod.

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

Myślę, że w wielu przypadkach testowanie pod kątem istnienia atrybutu w teście jednostkowym jest błędne. Ponieważ nie korzystałem z funkcji kontrolera podrzędnego MVC contrib, nie mogę komentować, czy jest to w tym przypadku odpowiednie.

+0

Otrzymałem +1, a następnie zauważyłem błąd. Powinien to być .IsDefined (typeof (Type), false); –

+0

@alexanderb masz oczywiście rację. Zaktualizowałem teraz swoją odpowiedź. Nie mogę sprawdzić mojej odpowiedzi na kompilator w tym czasie! Dzięki za wskazanie błędu – RichardOD

+7

to podejście jest szybsze niż poprzednie – Slava

5

Wiem, że ten wątek jest naprawdę stary, ale jeśli ktoś się na nim natknie, może się okazać, że projekt jest bardzo wygodny do wykonywania tego rodzaju twierdzeń.

typeof(MyPresentationModel).Should().BeDecoratedWith<SomeAttribute>(); 
8

Jest również możliwe stosowanie leków generycznych na to:

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

W ten sposób nie trzeba innego typeof(...), który może sprawić, że czystsze kodu.

+0

To nie działa dla mnie. Którego "używania" ... brakuje mi? –

+0

@Scanzy Nie jestem pewien, czy nie używasz IDE? (Zwykle sugerują prawidłowe "używanie"). Jakiego błędu otrzymujesz? – Kroltan

+1

ok, [tutaj] (https://msdn.microsoft.com/it-it/library/hh194292 (v = vs.110) .aspx) Znalazłem metodę "GetCustomAttribute ' jest dostępna z .NET 4.5 i moje IDE zostało ustawione na 3.5, więc wszystko jest już jasne –

Powiązane problemy