2013-08-03 50 views
6

我有一组基测试用于测试接口的多个实现。我建模的方式是创建一个带有[Ignore]属性的基础文本夹具。测试夹具的继承和被忽略的基础测试夹具

[TestFixture] 
[Ignore] 
public class BaseTests 
{ 
    // Use your imagination for the actual name 
    public virtual ITestableThing GetConcrete() 
    { 
     return null; 
    } 

    // All of my unit tests here 
} 

然后我写的每一个接口实现一个子类:

public class ConcreteThingTests : BaseTests 
{ 
    public override ITestableThing GetConcrete() 
    { 
     return new ConcreteThing(); 
    } 
} 

这工作得很好,因为我拥有所有在一个地方所有实现的测试,和子类只需指定实现。

问题是我必须将[Ignore]属性放在基类上,否则NUnit会尝试运行测试(并失败)。由于这个原因,我的测试结果总是被一系列Ignored测试混淆,尽管这不是什么大不了的事情,但我认为可能会有更好的模式避免忽略测试。

那么,我在执行测试夹具继承错误吗?

回答

4

您通常会在您的具体测试类中设置测试属性,而不是基类。

由于您似乎为多个类测试相同的功能,因此可以跳过整个测试层次结构,并将要测试的具体类注入到该测试基类中。

要使用NUnit来完成此操作,可以将TestCaseSource属性与类工厂方法一起用作参数。这方面的一个例子可以在这里找到:How to pass dynamic objects into an NUnit TestCase function?

制作了一些代码,为您的特定情况下,它可能是下面像图所示:

/// <summary> 
/// Earlier known as your BaseTests class 
/// </summary> 
[TestFixture] 
public class TestOfConcreteImplementationsOfInterface 
{ 
    [TestCaseSource("CreateConcretes")] 
    [Test] 
    public void VerifyImplementations(IWhatever thing) 
    { 
     int input = 42; 
     int result = thing.DoSomething(input); 
     Assert.That(result, Is.EqualTo(input)); 
    } 

    /// <summary> 
    /// Factory method for the concrete classes. If you want this in a seperate class, you can do that too using the 
    /// ctor public TestCaseSourceAttribute(Type sourceType, string sourceName); 
    /// </summary> 
    public IEnumerable<IWhatever> CreateConcretes 
    { 
     get 
     { 
      yield return new A(); 
      yield return new B(); 
     } 
    } 
} 

public interface IWhatever 
{ 
    int DoSomething(int x); 
} 

public class A : IWhatever 
{ 
    public int DoSomething(int x) 
    { 
     return x; 
    } 
} 

public class B : IWhatever 
{ 

    public int DoSomething(int x) 
    { 
     return x; 
    } 
} 
+1

我遇到的问题是它将基类与测试类紧密结合在一起。有人想要创建一个新的实现并根据规范对其进行测试,不需要修改基类以添加属性或更改方法。 –

13

NUnit的测试运行器似乎忽略基类,如果它是标记为:

public abstract class BaseTests 
{ 
} 
+0

Spot on。上投了反对票。 –

+0

繁荣。完善。我有一个抽象的测试夹具底座,但是当我创建了一个继承它的二级夹具底座时,NUnit开始抱怨它。为子类添加了抽象(从未尝试过这样做),它的工作就像一个魅力。李=人(tm)。 –

+1

我认为它是来自命名空间之外的抽象类。当我把它作为一个抽象复制到它工作的同一个项目中,而不是当他们在不同的项目中。 Nunit版本也必须是相同的 –