MS单元测试和CustomAttribute行为

时间:2016-02-16 18:57:16

标签: c# unit-testing attributes

我有一个[TestMethod],它使用Sql Server表作为其[DataSource]。我在该测试方法上也有一个自定义属性,可以在数据库中执行某些操作。

此自定义属性如下所示:

[AttributeUsage(System.AttributeTargets.Method)]
public class CustomAttribute : System.Attribute
{        
    public CustomAttribute(int number)
    {
        //do stuff with number
    }
}

整个测试方法如下:

[TestMethod]
[CustomAttribute(10)] //This value is different in each test method
[DataSource(connectionStuff)] //This returns 4 rows
public void Test(){
    //do test
}

当我运行测试并跟踪CustomAttribute中正在进行的操作时,它的构造函数被调用了60次,这比我预期的要多56倍。

我将此添加到要调试的属性:

[AttributeUsage(System.AttributeTargets.Method)]
public class CustomAttribute : System.Attribute
{        
    static bool check = false;

    public CustomAttribute(int number)
    {
        if(check) return;
        check = true;
        //do stuff with number
    }
}

现在,构造函数的其余部分仅运行4次,如最初预期的那样。

有人可以向我解释这里发生了什么吗?

1 个答案:

答案 0 :(得分:0)

创建类型时,一次评估成员属性。因此,当您的测试类是第一次引用时,将创建类型,并评估所有[CustomAttribute]调用。这与调用哪种方法无关,即无论执行哪种测试方法。

.NET中的属性只是元数据,附加到类型或成员。它们不是要修改成员,也不是在访问成员时调用。所以你绝对不应该让他们任何东西。您只应将它们用于存储信息。