2013-04-27 91 views
5

我一直在使用我一直在玩的海邊應用程序中使用測試驅動開發,並且我的所有數據都作爲對象存儲在圖像中(而不是數據庫)。使用Smalltalk Seaside測試夾具或同等測試數據?

所以,當我跑我的測試,我不得不小心地儲存起來真實的數據,然後纔會慢慢用測試數據丟棄,這樣的:

ToDoTest>>setUp 
    savedTasks := Task tasklist. 
    Task deleteAllTasks. 

    savedProjects := ToDoProject projectlist. 
    ToDoProject deleteAllProjects. 

    savedPeople := Person peoplelist. 
    Person deleteAllPeople. 

和:

ToDoTest>>tearDown 
    Task tasklist: savedTasks. 
    ToDoProject projectlist: savedProjects. 
    Person peoplelist: savedPeople 

問題出現在我的測試失敗時,當然他們會這樣做,這會彈出調試器,然後我可以修復,但tearDown並不總是被調用,所以我可能會丟失我的真實數據。

我確實將數據保存到文件中,所以它不是一個大問題,但它並不像我希望的那樣流暢和自動化。

無論如何,我可以改善這一點?

回答

6

我不確定是否有一個方案可以完全解決問題。真正的問題是模型是全球性的。這很方便,很好,但在這種情況下很容易失敗。所以我會考慮將模型從全局變爲更加本地化的變體,以便您可以創建僅用於測試目的的模型,而不會干擾生產數據。

要在當前設置中修復它,您需要在某處添加ensure:block。確保塊「確保」您執行某些操作,無論一切正常或發生錯誤。問題是你需要在測試前後進行測試。

在這種情況下,我會覆蓋的TestCase >>#runCase在自己的測試類的東西,如

runCase 
    [ self saveRealModel. 
     super runCase ] 
     ensure: [ self restoreRealModel ] 
+0

有趣。我認爲以某種方式劃分數據的想法可能對此有所幫助。例如,我的簡單待辦應用程序目前沒有用戶的概念,我可以添加這些應用程序,然後爲單元測試創​​建一個測試用戶。 – 2013-04-30 10:48:13

+0

有很多方法可以做到這一點。如果你想本地化你的數據,一個簡單的方法就是將事物從類一側移到實例一側。如果ToDoProject是您的主類,則將類方法移到實例端。你會有ToDoProject >>#taskList,ToDoProject >>#projectList,...在第一步中,你可以讓ToDoProject成爲一個單例,這樣ToDoProject類>>#默認會返回ToDoProject實例和你的真實數據。你的海濱組件將有一個instVar「項目」。然後,使用「ToDoProject默認值」配置組件,以便實際使用,並且爲了測試您將「ToDoProject new」 – 2013-04-30 12:41:37

2

啊,那是一個很好的測試氣味。諾伯特正確地指出,你的測試模型可能不應該是全球性的。大多數測試應該是單個對象之間的交互。 在故事板,我們有用戶

DEUser subclass: #SBUser 
    instanceVariableNames: 'email initials projects invitations' 
    classVariableNames: '' 
    poolDictionaries: '' 
    category: 'StoryBoard-Data' 

帶班instancevar用戶作爲一個入口點。項目只能通過用戶訪問。

users 
    ^users ifNil: [ users := OrderedCollection with: (SBAdministrator new 
     userid: 'admin'; 
     password: 'admin'; 
     yourself) 
    ] 

和方法來清除它們

resetUsers 
    " SBUser resetUsers " 
    users := nil 

我們經常可以在依賴傳遞創建域對象

Iteration>on: aProject 
    ^self new 
     project: aProject; 
     yourself 

這樣一個TestCase在自身或單獨的過程(模擬)對象