测试类是否具有属性?


101

我正在尝试进行一些“测试优先”的开发,并试图验证我的类是否标记有属性:

[SubControllerActionToViewDataAttribute]
public class ScheduleController : Controller

如何对类分配了该属性的单元测试?

Answers:


123

检查一下

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

不为null(Assert.IsNotNull或类似值)

(之所以使用它,IsDefined是因为大多数时候我也想验证属性的某些属性...。)


6
仅检查属性是否存在(通常是无参数/无属性的属性所需要的全部),使用.IsDefined会更便宜,因为它将查询元数据,而不会反序列化和实例化属性对象。
拉瑟五世卡尔森

1
就像IsDefined便宜一点一样,但是在大多数情况下(尤其是单元测试),您不太可能注意到差异。也许这是生产代码中的一个紧密循环……
Marc Gravell

@ Marc-我同意在单元测试中性能差异可能不会明显。如果需要使用该属性,我会得到它,正如您所说的,在大多数情况下就是这种情况。最近,我在编写的框架中使用IsDefined来在可排序字段的下拉列表中排除一列-这很好用,因为我不需要使用属性本身。
RichardOD

我们如何才能对一种方法进行相同的测试?
Manvinder Singh,

80

通常,您需要检查类的属性。

这是一些示例代码。

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

我认为在许多情况下,在单元测试中测试属性的存在是错误的。由于我没有使用过MVC contrib的子控制器功能,因此我无法评论在这种情况下是否合适。


+1,然后发现错误。它应该是.IsDefined(typeof(Type),false);
Alexander Beletsky

@alexanderb你当然是对的。我已经更新了我的答案。我一定不能在那时对照编译器检查我的答案!感谢您指出错误
-RichardOD

10
这种做法是快于以前
斯拉瓦

18

也可以对此使用泛型:

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

这样,您就不需要另一个typeof(...),它可以使代码更整洁。


这对我不起作用。using我想念哪一个?

@Scanzy我不确定,您没有使用IDE吗?(通常他们建议正确using)您会遇到什么错误?
Kroltan '17

1
好的,在这里我发现该GetCustomAttribute<SomeAttribute>方法适用于.NET 4.5,并且我的IDE设置为3.5,因此现在一切都清楚了

9

我知道这个线程确实很老,但是如果有人偶然发现它,您可能会发现fluentassertions项目对于执行这种声明非常方便。

typeof(MyPresentationModel).Should().BeDecoratedWith<SomeAttribute>();
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.