Test if a class has an attribute?
I'm trying to do a little Test-First development, and I'm trying to verify that my classes are marked with an attribute:
[SubControllerActionToViewDataAttribute]
public class ScheduleController : Controller
How do I unit test that the class has that attribute assigned to it?
check that
Attribute.GetCustomAttribute(typeof(ScheduleController),
typeof(SubControllerActionToViewDataAttribute))
isn't null (Assert.IsNotNull
or similar)
(the reason I use this rather than IsDefined
is that most times I want to validate some properties of the attribute too....)
The same you would normally check for an attribute on a class.
Here's some sample code.
typeof(ScheduleController)
.IsDefined(typeof(SubControllerActionToViewDataAttribute), false);
I think in many cases testing for the existence of an attribute in a unit test is wrong. As I've not used MVC contrib's sub controller functionality I can't comment whether it is appropriate in this case though.
It is also possible to use generics on this:
var type = typeof(SomeType);
var attribute = type.GetCustomAttribute<SomeAttribute>();
This way you do not need another typeof(...)
, which can make the code cleaner.
I know this thread is really old, but if somebody stumble upon on it you may find fluentassertions project very convenient for doing this kind of assertions.
typeof(MyPresentationModel).Should().BeDecoratedWith<SomeAttribute>();