web-dev-qa-db-fra.com

Tester si une classe a un attribut?

J'essaie de faire un petit développement Test-First, et j'essaie de vérifier que mes classes sont marquées avec un attribut:

[SubControllerActionToViewDataAttribute]
public class ScheduleController : Controller

Comment puis-je tester par unité que cet attribut lui est attribué?

93
JoshRivers

regarde ça

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

n'est pas nul (Assert.IsNotNull ou similaire)

(la raison pour laquelle j'utilise ceci plutôt que IsDefined est que la plupart du temps je veux aussi valider certaines propriétés de l'attribut ....)

116
Marc Gravell

La même chose que vous vérifieriez normalement pour un attribut sur une classe.

Voici un exemple de code.

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

Je pense que dans de nombreux cas, tester l'existence d'un attribut dans un test unitaire est faux. Comme je n'ai pas utilisé la fonctionnalité de sous-contrôleur de MVC contrib, je ne peux cependant pas dire si elle est appropriée dans ce cas.

70
RichardOD

Il est également possible d'utiliser des génériques sur ceci:

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

De cette façon, vous n'avez pas besoin d'une autre typeof(...), ce qui peut rendre le code plus propre.

14
Kroltan

Je sais que ce fil est vraiment ancien, mais si quelqu'un tombe dessus, vous pouvez trouver fluentassertions projet très pratique pour faire ce genre d'assertions.

typeof(MyPresentationModel).Should().BeDecoratedWith<SomeAttribute>();
6
Aleksey L.