2011-11-01 26 views
1

我在AS3中創建一個使用堆棧作爲其基礎數據結構(用鏈表實現)的對象池。我是FlexUnit的新手,但我真的很想爲我的類進行一些單元測試(因爲在一個新項目中測試它們會很麻煩)。如何使用FlexUnit 4測試鏈表對象池?

我遇到了一些問題,試圖跟蹤變量,但是,因爲我的班級成員不公開;我希望能夠測試隻影響類的成員的私有方法。 (例子包括創建列表,將節點從棧中彈出,將節點推回堆棧等)

FlexUnit的實踐似乎聲明,您有一個單獨的測試類,可以針對您的類運行測試方法。但是,這些類將無法訪問我的私有變量,並且我不希望僅爲單元測試創​​建getter和setter。有沒有解決的辦法?可以將測試方法添加到類本身(Python風格)中,而不是添加到測試用例類中?

如果之前詢問過,我很抱歉。我對此很陌生;我感謝您的幫助。如果我需要使用代碼片段或其他任何東西來澄清,請告訴我。

編輯:我意識到我的數據結構實際上是一個堆棧,而不僅僅是一個通用的鏈表。我已經更新了這個問題來反映這一點。

回答

1

如果您的鏈接列表完全有用,它會公開一些讓您訪問此信息的內容。例如,在我發佈在http://flexdiary.blogspot.com/2009/12/riadventure-inspiration.html的實現中,該列表本身沒有真正公開(因爲鏈表主要只是它的節點 - 爲了使它更有用,我分離出了​​一個可以遍歷鏈接的遊標) 。

遊標具有列表的入口點節點,所以如果你想要的話,你可以通過檢查入口點來測試列表是否已經被創建。但它是作爲構造函數的參數傳遞的,所以很多人只會將其視爲已讀,而不會爲測試而煩惱。

要測試一個鏈接已添加到最後,可以迭代到最後並檢查最後的節點是否是您添加的節點(除非您的列表是循環的,在這種情況下您可能有很難確定你已經到了最後)。然而,鏈接列表的要點是,您需要添加鏈接(通過將nextLink或前一個鏈接的任何屬性設置爲新節點,並將舊鏈接的舊鏈接添加到新節點)鏈接在兩個方向上),所以你可能會遇到這個問題,因爲當你最好使用Array時你試圖創建一個全新的構造。

請注意,如果您想使用我的實施,歡迎您。我在開始做TDD之前寫過它,所以它沒有測試,但我至少在一些形式的項目中使用過它。

+0

嗯....我寫的方式,我有一個類我的節點對象,我有一個工廠類,創建和管理列表,這是我的池對象。只有Pool對象應該能夠訪問實際的鏈接;這允許用戶在不破壞它的情況下推送和彈出池(手動設置鏈接爲空等)。由於這個池的性質,我不需要用於迭代的遊標,並且該列表只需要單獨鏈接,所以我可能最終會滾動我自己的。它實際上比任何東西都更重要。 (這也是很好的做法!:D) –

+0

其實,你的評論讓我覺得 - 這實在是一個堆棧,用一個單鏈表實現。我會更新我的問題以使其更清楚。 –

+0

然後,真正你需要的只是對列表中最後一個鏈接的引用,這真的很容易測試 - 當你從池中請求什麼東西時,你放入池中的最後一件東西是什麼? –

2

下面是我用於現代單元測試框架的技巧。使用現代框架,您不必擴展TestCase類或TestSuite類。當你必須處理不公開的測試方法或類別字段時,這個基本的東西給了你這樣的自由。

這裏的竅門:

  1. 假設這是你需要測試的類:

    package com.npacemo.structures { 
    
    class Stack 
    { 
        public function push(item:Object):void 
        { 
        } 
    
        public function pop():Object 
        { 
        } 
    
        protected var top:Object; 
    } 
    } 
    
  2. 您的測試可以繼承堆棧:

    package com.npacemo.structures { 
    
    class StackTest extends Stack 
    {  
        [Test] public function 
        should_push_the_item_on_top():void 
        { 
         var item:Object = {name: "Item 01"}; 
         push(item); 
         assertThat(top.name, equalsTo("Item 01")); 
        } 
    } 
    } 
    

    如果您不喜歡protected你也可以使用package -access,但make sur e測試和被測試的類是在同一個包中。

重要的是不要讓您的抽象與getter和setter方法以及public字段和方法一起泄漏,僅用於測試目的。另一方面,如果你的類的目的是成爲一個數據結構,那麼getter和setter就是非常有意義的。羅伯特C.馬丁詳細討論了數據結構和對象之間的二分法。

+0

我不相信我沒有想到這一點。如果我不能將我的測試方法與我的課程聯合起來,這真的可能是一條路。今晚,我會看看這是否適用於FlexUnit(我認爲測試用例不需要繼承)並查看它是否可行。我仍然會遇到私有變量問題,但我寧願在受保護和私有之間切換,也不願意僅爲測試而抽象抽象。 (偉大的措辭,必須偷。)另外,我認爲你的意思是'內部'而不是'package-access'。 ;-) –

+0

「泄漏抽象」不是我創造的術語。它來自Joel Spolsky - http://www.joelonsoftware.com/articles/LeakyAbstractions.html –