Проверить, есть ли у класса атрибут?

Я пытаюсь сделать небольшую разработку Test-First и пытаюсь убедиться, что мои классы отмечены атрибутом:

[SubControllerActionToViewDataAttribute]
public class ScheduleController : Controller

Как мне модульно протестировать, что классу назначен этот атрибут?


person JoshRivers    schedule 04.08.2009    source источник


Ответы (4)


Проверь это

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

не является нулевым (Assert.IsNotNull или подобным)

(причина, по которой я использую это, а не IsDefined, заключается в том, что в большинстве случаев я также хочу проверить некоторые свойства атрибута....)

person Marc Gravell    schedule 04.08.2009
comment
только для проверки наличия атрибута, что обычно требуется для атрибутов без параметров/свойств, дешевле использовать .IsDefined, так как он будет запрашивать метаданные, а не десериализовать и создавать экземпляр объекта атрибута. - person Lasse V. Karlsen; 04.08.2009
comment
Как и в том, что IsDefined дешевле... но в большинстве случаев (и в частности модульных тестов) вы вряд ли заметите разницу. Может быть, если бы это была узкая петля в производственном коде... - person Marc Gravell; 04.08.2009
comment
@Marc- Я согласен с тем, что разница в производительности, вероятно, не будет заметна в модульном тесте. Я бы получил атрибут, если бы мне нужно было его использовать, что, как вы говорите, является сценарием в большинстве случаев. Недавно я использовал IsDefined в структуре, которую я писал, чтобы исключить столбец в раскрывающемся списке сортируемых полей — это сработало хорошо, поскольку мне не нужно было использовать сам атрибут. - person RichardOD; 04.08.2009
comment
Как мы можем проверить то же самое для метода? - person Manvinder Singh; 23.04.2020

То же самое, что вы обычно проверяете на наличие атрибута в классе.

Вот пример кода.

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

Я думаю, что во многих случаях проверка существования атрибута в модульном тесте неверна. Поскольку я не использовал функциональные возможности субконтроллера MVC contrib, я не могу комментировать, подходит ли он в данном случае.

person RichardOD    schedule 04.08.2009
comment
Сделал +1, а потом заметил ошибку. Должно быть .IsDefined(typeof(Type), false); - person Alexander Beletsky; 05.04.2012
comment
@alexanderb ты конечно прав. Я обновил свой ответ сейчас. Я, должно быть, не проверял свой ответ компилятором в то время! Спасибо, что указали на ошибку - person RichardOD; 23.06.2012
comment
этот подход быстрее, чем предыдущий - person Slava; 18.07.2014

Также можно использовать дженерики для этого:

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

Таким образом, вам не нужен еще один typeof(...), который может сделать код чище.

person Kroltan    schedule 12.03.2016
comment
Это не работает для меня. Какие using .. я пропустил? - person ; 19.04.2017
comment
@Scanzy Я не уверен, ты не используешь IDE? (Обычно они предлагают правильный using) Какую ошибку вы получаете? - person Kroltan; 19.04.2017
comment
хорошо, здесь я нашел GetCustomAttribute<SomeAttribute> метод доступен из .NET 4.5, и моя IDE была установлена ​​​​на 3.5, так что теперь все ясно - person ; 19.04.2017

Я знаю, что эта ветка действительно старая, но если кто-то наткнется на нее, вы можете найти fluentassertions очень удобен для выполнения такого рода утверждений.

typeof(MyPresentationModel).Should().BeDecoratedWith<SomeAttribute>();
person Aleksey L.    schedule 25.09.2015