2013-08-03 52 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版本也必須是相同的 –