2009-02-14 49 views
7

如果我有以下代碼:使用NUnit派生類中的SetUp?

[TestFixture] 
public class MyBaseTest 
{ 
    protected ISessionManager _sessionManager; 

    [SetUp] 
    public void SetUp() { /* some code that initializes _sessionManager */ } 
} 

[TestFixture] 
public class MyDerivedTest : MyBaseTest 
{ 
    IBlogRepository _repository; 

    [SetUp] 
    public void SetUp() { /* some code that initializes _repository */ } 

    [Test] 
    public void BlogRepository_TestGoesHere() { /* some tests */ } 
} 

... NUnit的不叫基本安裝例程。這是預料之中的,我自己也沒有問題。我可以得到導出的SetUp首先調用基本SetUp,如下所示:

[TestFixture] 
public class MyDerivedTest : MyBaseTest 
{ 
    IBlogRepository _repository; 

    [SetUp] 
    public new void SetUp() 
    { 
     base.SetUp(); 
     /* some code that initializes _repository */ 
    } 

這很難看。如果它是一個構造函數,我不需要。

我可以使用「模板法」的格局,並具備以下條件:

public void MyBaseTest 
{ 
    abstract void SetUp(); 

    [SetUp] 
    public void BaseSetUp() 
    { 
     /* base initialization */ 
     SetUp(); // virtual call 
    } 
} 

我不是特別喜歡這種方式,無論是。

當他們的測試類需要SetUp時,你會做什麼?它們是從另一個需要SetUp的類派生的?

回答

9

您必須直接調用該方法。

[SetUp] 
    public void DerivedSetUp() 
    { 
     base.BaseSetUp(); 
     // Do something else 
    } 

編輯:我沒有嘗試過,但也許部分方法也可能工作。儘管如此,我寧願去做上面的事情。

Edit2:我剛剛嘗試過使用部分方法。它沒有工作。即使這樣做,我認爲調用基類仍然會更容易。

+0

我知道。我不想。 – 2009-02-14 12:00:44

+0

部分方法呢?因爲SetUp裝飾有屬性,所以我不確定會有更多的方法來實現它。 – 2009-02-14 12:02:13

+0

哦。沒有想到部分方法。有趣的方法。 – 2009-02-14 12:04:19

3

顯式地擁有基類。鑑於NUnit使用[Setup]屬性來標記測試設置,我認爲這對於NUnit來說是「正確的」,因爲它遵循通常的語言規則。

當然,NUnit可以搜索基類,並自動調用它們的設置函數,但是我認爲這對大多數人來說是相當驚奇的。

然而至少有一個單元測試框架使用構造函數進行設置:xUnit.Net。在這裏,基類設置自動調用,因爲這是C#中的構造函數的行爲。

(請注意,雖然,xUnit.Net建議再次使用的測試設置。)

-1

在MbUnit的以下作品。它也可以在NUnit中工作。

[TestFixture] 
public abstract class Base { 
    [SetUp] 
    public virtual void SetUp() { 
     //Some stuff. 
    } 
} 

public class Derived : Base { 
    public override void SetUp() { 
     base.SetUp(); 
     //Some more stuff. 
    } 
    [Test] 
    public virtual void Object_WhenInACertainState_WhenAMethodIsCalled_Throws() { 
     //Create and set state on the object. 
     //Call the method. 
     //Assert the method threw. 
    } 
} 
0

,我用我在TDD縱火坦帕學到的方法是在基類中的設置方法,然後在所謂的觀察基類的虛方法。然後在設置方法結束時在基類中調用此方法。

然後,您所做的是在從基類派生的新類中,您將覆蓋觀察方法。在這種情況下的訣竅是您要執行基類的安裝方法,並且子類沒有安裝方法。原因是你在觀察方法中的代碼只是你需要的孩子測試類的那些額外的東西。

這種方法對我來說很好,但一個問題是測試運行器會想要執行基類測試,所以我做的解決方法是將測試從基類移動到一個新類中如果我有任何的話,從基地派生。

1

看起來您希望安裝程序在任何測試開始之前運行一次,而不是在每次測試運行之前運行一次。註釋[SetUp]使方法在夾具運行中的每個測試之前運行一次。 [SetUp]不被繼承。

要使用的註釋是[TestFixtureSetUp],它只在運行夾具中的任何測試之前運行一次。這是以你期望的方式繼承的。 :)

請參閱the TextFixtureSetUp docs