2010-07-13 31 views
0

說我有以下方法:我如何測試ruby中gets方法的用戶輸入?

#Create new guest object. Add it to array and save it to disc 
    def new_guest 
    printf "First name: " 
    first_name = gets.chomp 
    printf "Last name: " 
    last_name = gets.chomp 
    printf "Adress: " 
    adress = gets.chomp 
    printf "Phone:" 
    phone = gets.chomp 
    new_guest = Guest.new(first_name, last_name, adress, phone) 
    @guests.push(new_guest) 
    File.open("guests", 'w') {|f| Marshal.dump(@guests, f) } 
    end 

我怎麼會爲它編寫單元測試,可以在對得到的值傳遞? 我發現的全部是this article,但我不知道如何在這種情況下使用它。 林也想知道是否有一個好方法來標記從測試運行時不應該運行的東西?例如,我可能不想保存虛擬對象。

+0

我正要提出一個建議中產生的值來測試new_guest,但我想我已經在#ruby中給你了。對於任何徘徊者來說,看看這篇博客文章,瞭解如何在Ruby中測試標準輸入/輸出:http://technicalpickles.com/posts/a-pattern-for-using-standard-in-andout在你的紅寶石代碼/ – Telemachus 2010-07-13 18:04:52

+0

這就是我在帖子中鏈接到的文章:) – 2010-07-13 18:58:29

+0

哎呀。我讀得太快了。對不起,Patrik。 – Telemachus 2010-07-13 23:50:37

回答

4

你努力測試這種方法的原因是因爲該方法做得太多。此方法正在收集用戶的輸入,創建一個新對象,將該記錄添加到列表並將其保存到磁盤。您將UI,數據訪問和對象持久性全部封裝在一個方法中。

嘗試將該方法拆分爲更小的方法,然後單獨測試這些方法。至少,你可以有2種方法如下: -

def new_guest(first_name, last_name, address, phone) 
    guest = Guest.new(first_name, last_name, address, phone) 
    @guests.push(new_guest) 
    File.open("guests", 'w') {|f| Marshal.dump(@guests, f) } 
end 

def get_guest_data() 
    printf "First name: " 
    first_name = gets.chomp 
    printf "Last name: " 
    last_name = gets.chomp 
    printf "Adress: " 
    adress = gets.chomp 
    printf "Phone:" 
    phone = gets.chomp 
    [ first_name, last_name, address, phone] 
end 

然後你的單元測試中你可以通過在你的測試用例

+0

這是非常真實的,方法主要是一個(壞)的例子,但你的答案讓我覺得,也許我應該測試輸入驗證(沒有在例子中)而不是實際的輸入。如果我正確驗證輸入應該不是問題嗎? – 2010-07-13 19:02:13

+0

那麼你當然應該測試任何輸入驗證,以確保它爲標準和邊緣條件做了正確的事情。如果你有一個函數也收集輸入,那麼你應該通過確保數據被收集並正確傳遞給其他函數來測試這個函數,並且你的鏈接文章中有很好的例子來說明如何做到這一點。 – 2010-07-14 09:14:18

相關問題