为什么不是xUnit.net的FactAttribute AttributeUsage.Inheritable?

时间:2012-07-18 16:20:39

标签: c# nunit mstest mbunit xunit.net

之前没有编写单元测试框架,在我看来,如果程序集中的某些类型都需要针对类似的事情进行测试,那么可继承的Fact属性会使编写抽象测试类或测试接口变得更容易。

是否存在Fact无法继承的设计理由?我认为使用属性来识别测试方法的其他测试框架(NUnit,MSTest,MbUnit等)也是类似设计的。我错过了什么?

以下是xunit(版本1.9.1.1600)的FactAttribute的开头:

[AttributeUsage(AttributeTargets.Method, AllowMultiple = false)]
public class FactAttribute : Attribute
{

我试图理解为什么它看起来不像以下那样:

[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public class FactAttribute : Attribute
{ 

3 个答案:

答案 0 :(得分:2)

FactAttribute是可继承的。

看看这篇文章: http://iridescence.no/post/Extending-xUnit-with-a-Custom-ObservationAttribute-for-BDD-Style-Testing.aspx

我认为它有时非常有用。

答案 1 :(得分:1)

我从未听说过属性是可继承的,就像类一样。尽管使用通用测试方法编写基类并将[Fact]属性应用于派生类中的方法,但您应该没有问题。

答案 2 :(得分:1)

我经常在我的测试中使用模板模式(这似乎是你想要完成的),并且它可以与xUnit.net一起使用。

public abstract class TestBase
{
    [Fact]
    public void Verify()
    {
        // Step 1
        // Step 2

        // Overridable step 3
        DoStuff();

        // Assert
    }

    protected abstract void DoStuff();
}

public class Test1 : TestBase
{
    protected override void DoStuff()
    {
        // Test1 variation
    }
}

public class Test2 : TestBase
{
    protected override void DoStuff()
    {
        // Test2 variation
    }
}

验证执行两次 - 一次在实例Test1上,一次在Test2实例上。

希望这有帮助。