2017-06-19 50 views
1

鑑於我在一個名爲GBase的程序集中有一個類,它帶有一個構造函數,它帶有兩個參數和一個GBase的子類(稱爲GDerived),它具有相同的參數,我是否將這些分開以便我可以對子類進行單元測試?如何爲參數化基類的子類編寫單元測試

在OtherAssembly:

public class GBase 
{ 
    public GBase(ParamType1 param1, ParamType2 param2) 
    { 
    ... 
    } 

    protected ParamType1 SomeProperty { get; set; } 

// other stuff 
} 

在ThisAssembly:

public class GDerived : GBase 
{ 
    public GDerived(ParamType1 param1, ParamType2 param2) 
     :base(param1, param2) 
    { 
    // new code 

    SomeProperty = newCalculatedValue; 

    // other stuff 
    } 

// other stuff 
} 

原始GBASE類傳統代碼,由於是程序的總體結構 - 改變結構是不可能的由於代碼庫的大小(10k行以上) - 直到最近,它們都沒有爲它編寫單元測試。

所以,現在我想寫一個測試(使用NUnit)的子類構造函數來驗證正確的屬性填充正確的值。請注意,測試類與測試類位於同一個項目中。

[TestFixture] 
public class GDerivedTests 
{ 
    [Test] 
    public void GDerivedConstructor_ValidParams_PropertiesSetCorrectly() 
    { 
    var newGDerived = new GDerived(parameter1, parameter2); 

    Assert.That(SomeProperty == parameter1; 
    } 
} 

這是我們不得不面對一個非常粗糙的代表,並有比我們需要測試的基類設置屬性的其他案件。我甚至不知道從哪裏開始。我有Michael Feathers撰寫的「使用遺留代碼有效地工作」一書,但它似乎沒有涵蓋這種普遍的「設計模式」,在我們正在處理的代碼中廣泛使用。是因爲它非常簡單,任何眨眼的idjyot都應該知道如何處理它,還是因爲這是一種罕見的情況?不知何故,我不認爲它是,但我可能是錯的...

我想到的一種可能的方法是提取基類的接口和模擬基類的構造函數 - 但我不知道關於如何做到這一點的細節。請注意,我們都是團隊單元測試的相對新手,沒有經驗可供借鑑。不編碼新手,只是單元測試新手。

TIA, 戴夫

回答

1

首先:保持簡單!在你的例子中,你可以測試的唯一東西是SomeProperty。其他一切都在基類中,你似乎不想測試,所以測試方法GDerivedConstructor_ValidParams_PropertiesSetCorrectly()是沒有意義的。長期來看,雖然它可能是明智的測試。

測試通常包含三個稱爲AAA的元素:Arrange,Act和Assert。所以寫下你的測試:

[Test] 
public void GDerivedTestOfSomeProperty() 
{ 
    // arrange 
    ParamOfSomeProperty expected = ValueWeAreLookingFor; // this is something that you 
                 // have in newCalculatedValue 

    // act 
    GDerived actual = new GDerived(
     AnyValueThatMakesThisTestWork1, // maybe null? 
     AnyValueThatMakesThisTestWork2); // maybe null? 

    // assert 
    Assert.AreEqual(expected, actual.SomeProperty); 
} 

這就是一個開始。從這裏出發。你會很快看到你得到大量的冗餘代碼,所以你可能想在一段時間後重新設計。

Mocking對於測試基類或基類對被注入的對象做些奇怪的事情是有意義的。在這種情況下,傳遞模擬而不是真實的對象。我個人會使用一個模擬框架來爲你做所有的工作,你也可以用它來測試基類本身。一個着名的例子是moq

附註:如果將測試類移動到自己的項目中,將會更好。測試代碼不應該因爲各種原因而被釋放,加上構建,測試和部署可能會變得更容易,如果他們分開。

+0

即使作爲一個相對的新手,我也熟悉這個方法和框架。 :)我們使用NUnit和Moq開始。我們將測試添加到添加到現有應用程序的新代碼中,直到最近才從未見過單元測試。 – DaveN59

+0

感謝您的出色反應。事實證明,我們還有其他問題被Resharper中的「bug」所掩蓋。有一個Resharper選項(正在測試Shadow-copy程序集)可以防止真正的錯誤報告。禁用該功能後,真正的錯誤是GBase類中其他程序集中其他類的依賴關係。我們有我們的工作爲我們... – DaveN59

+0

至於旁註,這兩種方法都有完全有效的論點。我們仍在辯論最佳方法。 – DaveN59

相關問題