web-dev-qa-db-ja.com

クラスに属性があるかどうかをテストしますか?

私は少しテストファースト開発をしようとしています、そして、クラスが属性でマークされていることを確認しようとしています:

[SubControllerActionToViewDataAttribute]
public class ScheduleController : Controller

クラスにその属性が割り当てられていることを単体テストするにはどうすればよいですか?

93
JoshRivers

それを確認します

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

nullではない(Assert.IsNotNull または類似)

IsDefinedではなくこれを使用する理由は、ほとんどの場合、属性の一部のプロパティも検証するためです。..)

116
Marc Gravell

通常、クラスの属性を確認するのと同じです。

サンプルコードを次に示します。

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

多くの場合、単体テストの属性の存在をテストすることは間違っていると思います。 MVC contribのサブコントローラー機能を使用したことがないため、この場合に適切かどうかについてはコメントできません。

70
RichardOD

これにジェネリックを使用することもできます。

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

これにより、別のtypeof(...)が不要になり、コードがよりきれいになります。

14
Kroltan

私はこのスレッドが本当に古いことを知っていますが、誰かがそれにつまずいた場合、 fluentassertions この種のアサーションを行うのに非常に便利なプロジェクトを見つけるかもしれません。

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