2013-07-15 18 views
2

我開始以Phil Haack建議的方式組織我的單元測試here。我的測試類每個公共方法都有一個嵌套類。嵌套類是從外部類派生的,以便繼承它的設置代碼。如何構建單元測試當你想測試派生類與基類的交互作用

我現在有一種情況,我想測試一個抽象基類和兩個派生類的簡單層次結構。我想顯式測試每個派生類與基類的交互,而不是用某種模擬派生類來測試基類。

我使用基本測試夾具,每個派生類中派生一個夾具,在過去做到了這一點,其中衍生的燈具必須實現在基部固定裝置測試了幾個模板方法:

[TestFixture] 
public abstract class BaseFixture 
{ 
    protected abstract MyBaseClassUnderTest GetTestInstance(); 

    [Test] 
    public void SomeMethod_SomeCondition_SomeOutcome() 
    { 
     var sut = GetTestInstance(); 

     //test base class behavior here 
    } 

    //More base class tests here 
} 

public class DerivedFixture : BaseFixture 
{ 
    protected override MyBaseClassUnderTest GetTestInstance() 
    { 
     return new DerivedInstance(); 
    } 

    //Tests for derived class go here 
} 

有沒有人有想法,我該如何解決這個問題?現在我看不到,由於不同的繼承策略(從外部類繼承設置代碼與從基類設備繼承基類測試),我怎麼能夠結合這兩種方法。

回答

2

這是一個非常有趣的問題,當然多重繼承是不可能的,因此我猜你需要爲你使用的兩種繼承策略之一找到替代方案。

個人意見是,你應該保持組織測試的整體測試套件一致性的方法,並尋找替代方法來通過類層次結構共享測試。我知道最接近多重繼承的概念是Mixins,如果你看這個答案Is it Possible to Implement Mixins in C#看起來mixin可以使用擴展方法來模擬。我會沿着這條路走下去 - this blog post討論了創建可以訪問使用它們的類中保存的數據的可能策略,您需要我相信能夠將派生類實例提供給基類​​級別的測試(即替換GetTestInstance)。

+0

這是一個有趣的想法,但是您能否想到一個NUnit測試夾具的實際示例,測試運行器實際上可以運行該示例嗎?我不能。 – EagleBeak