2012-12-28 158 views
0

我真的不知道如何編寫「獨立」行爲測試。如何編寫獨立功能測試

E.G.用戶可以將地址添加到地址簿。

所以我有一個地址簿類。我寫一個測試來添加一個地址。但是,如何在不調用「顯示地址」方法的情況下驗證地址是否成功寫入?當我調用「顯示地址」方法時,我依賴於顯示方法的功能和工作。即使那樣,是不是在一次測試中測試兩種行爲?

或者如果我深入數據庫進行驗證,是不是將「行爲」與實施聯繫起來?

回答

0

這聽起來像你節省下來到在某一時刻數據庫中的地址,這意味着無論是

一)地址簿需要公開的附加地址以某種方式 - 通過無論是「GetAddresses」方法,或「AddedAddresses」公共屬性 - 這樣它們可以被其他對象拾取和保存(聽起來很可能來自您所說的內容);或

b)你在地址簿類上有一些「保存」方法,它引發了一個操作將地址保存到數據庫,這意味着在你的地址簿類中,你依賴於一些其他對象,如存儲庫或數據訪問類。

如果a),那麼您需要調用該方法或屬性以確保按照您的預期添加地址。如果b),那麼你可以向通訊錄提供一個虛假的數據訪問類,暴露該虛假的公共財產,調用地址簿上的「保存」方法,並且對假的公共「地址」屬性進行驗證數據訪問類,像這樣:

(你沒有提到的語言,所以這僅僅是僞代碼)

class addressbook 

    private _dataAccess 
    private addresses 

    constructor (dataaccess) _dataAccess = dataAccess 

    public method AddAddress(address) addresses.add(address) 

    public method save() _dataaccess.save(addresses) 



class fakedataaccess 

    public addresses 

    public method save(addresses) addresses = addresses 


{test} 
public test AddingAddressesWorks 

    fake = new fakedataaccess 
    book = new addressbook(fake) 

    // Do stuff to add addresses to addressbook 

    book.save 

    assert fake.addresses == the_addresses_i_added 

希望這是有道理的。你也可以通過模擬實現,但這超出了我僞代碼的範圍,無論如何這個概念是一樣的。

但無論如何,你是對的,你需要調用別的東西(因此可能會爭辯說你正在測試另一個構造),以驗證你想要驗證的內容。

就個人而言,如果是我,我會在地址簿上放置一個公共「地址」屬性。

+1

這是比功能測試更多的單元測試嗎?我正在談論的東西更多的是託管應用程序和發佈數據到一個頁面的行,只是爲了確保整個應用程序的工作。 –

+0

您正在討論集成測試,在這種情況下,您應該將一些已知輸入放入您提到的用於調用該過程的頁面中,讀取數據庫結果並驗證它們是您期望的內容,然後自行清理即從數據庫中刪除數據)。爲了回答你最初的問題,測試「實現」正是集成測試的目的,所以在這種情況下,做到這一點並且不會感覺不好。 –