【问题标题】:Test if a class has an attribute?测试一个类是否有属性?
【发布时间】:2018-06-05 20:44:11
【问题描述】:

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

[SubControllerActionToViewDataAttribute]
public class ScheduleController : Controller

我如何对类分配了该属性进行单元测试?

【问题讨论】:

    标签: c# unit-testing attributes


    【解决方案1】:

    检查一下

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

    不为空(Assert.IsNotNull 或类似)

    (我使用这个而不是IsDefined 的原因是大多数时候我也想验证属性的某些属性......)

    【讨论】:

    • 仅检查属性是否存在,这通常是无参数/无属性属性所需的全部,使用 .IsDefined 更便宜,因为它将查询元数据,而不是反序列化和实例化属性对象。
    • IsDefined 更便宜的意义在于......但在大多数情况下(尤其是单元测试),您不太可能注意到差异。也许如果它是生产代码中的一个紧密循环......
    • @Marc- 我同意在单元测试中性能差异可能不会很明显。如果我需要使用它,我会得到该属性,正如您所说,这是大多数情况下的情况。我最近在我正在编写的框架中使用 IsDefined 来排除可排序字段下拉列表中的列 - 这很有效,因为我不需要使用属性本身。
    • 我们怎样才能测试同样的方法?
    【解决方案2】:

    您通常会检查类的属性。

    这里有一些示例代码。

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

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

    【讨论】:

    • 做了 +1 然后发现错误。应该是 .IsDefined(typeof(Type), false);
    • @alexanderb 你当然是对的。我现在更新了我的答案。我当时一定不能检查我对编译器的回答!感谢指出错误
    • 这种方法比以前的方法更快
    【解决方案3】:

    也可以在这个上使用泛型:

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

    这样你就不需要另一个typeof(...),这样可以让代码更干净。

    【讨论】:

    • 这对我不起作用。我错过了哪个using ..?
    • @Scanzy 我不确定,你没有使用 IDE 吗? (通常他们建议正确的using)你得到什么错误?
    • 好的,here 我发现 GetCustomAttribute&lt;SomeAttribute&gt; 方法适用于 .NET 4.5,我的 IDE 设置为 3.5,所以现在一切都清楚了
    【解决方案4】:

    我知道这个帖子很老了,但如果有人偶然发现它,你可能会发现 fluentassertions 项目非常适合做这种断言。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-07
      相关资源
      最近更新 更多