Проверить, есть ли у класса атрибут? - PullRequest
91 голосов
/ 04 августа 2009

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

[SubControllerActionToViewDataAttribute]
public class ScheduleController : Controller

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

Ответы [ 4 ]

115 голосов
/ 04 августа 2009

проверьте, что

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

не равно нулю (Assert.IsNotNull или аналогичный)

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

67 голосов
/ 04 августа 2009

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

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

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

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

14 голосов
/ 12 марта 2016

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

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

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

6 голосов
/ 25 сентября 2015

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

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