2011-12-10 60 views
4

我剛剛進入TDD Rails。讓我困惑的是「什麼時候寫測試」。所有指南都建議您在編寫任何代碼之前編寫測試,但是如果我在創建Person模型之後編寫任何代碼之前編寫以下測試;Rails TDD - 先寫什麼

p = Person.new 
p.firstname = "mikey" 
p.lastname = "hogarth" 
assert_equal p.fullname, "mikey hogarth" 

然後測試本身不會失敗,它會崩潰!因爲我還沒有實現「全名」方法,所以會出現運行時錯誤。因此,在我編寫代碼之前,我不可能讓測試失敗。

TDD編碼器通常如何處理這種情況?它基本上是用虛擬方法存根還是有更好的方法?

===編輯===

建議了很多很棒的點子。我最終決定以下選項達到了我想要做的最優雅的事情;

if p.respond_to? "fullname" 
    assert_equal "Mikey Hogarth", p.fullname 
else 
    flunk "fullname not implemented" 
end 

===第二個編輯===

如果您在這個答案絆倒,看來我的整個方法TDD是問題,因此,儘管上面的代碼將工作是不是好的做法。

+0

爲什麼不嘗試測試是否定義了p.fullname? – prusswan

+0

我認爲這可能是這樣的,我正在玩這種語法: p = Person.new; methods =%q {name firstname fullname}; methods.each {| method |斷言p.respond_to?方法 }。 這是人們通常如何做的嗎? –

+0

@MikeyHogarth我建議您通過示例瞭解Kent Beck的測試驅動開發。雖然它使用Java,但本書中的概念適用於任何語言。它被認爲是TDD的「Hello World」書。 http://www.amazon.co.uk/Test-Driven-Development-Addison-Wesley-Signature/dp/0321146530 – Finglas

回答

3

你想寫你希望你的代碼。在C風格語言/靜態編譯語言中,上述內容甚至不會編譯,因爲您正確地聲明代碼不存在。這很好,然後你將實現最低限度的代碼生成以運行你的測試。換句話說,你的測試驅動你的設計。

我的Ruby非常生鏽,但在上面的例子中,將會拋出一些不存在的方法/屬性,如method_missing。因此你會創建它們。

class Person 
    attr_accessor :firstname, :lastname 

    def fullname 

    end 
end 

如果你現在運行你的測試,你將得到零從全名返回。因此我們將實現全名方法。這裏需要注意的是,消息已經改變了,而不是Ruby對缺少方法呻吟,測試呻吟說我們還沒有正確實施這些方法。

def fullname 
    return @firstname + " " + @lastname 
end 

現在您的測試將通過。

基本上你想要改變你的測試在運行後顯示的消息(這將證明你正在某處)或者你想讓它通過。測試通過後,您可以重構。上面的方法很簡單,但你可以刪除return語句,使用字符串格式或其他。只要測試通過後,你就知道你很好。

+0

@surname或@lastname? – buruzaemon

+0

我懷疑它會寫在虛擬方法 - 會給它一點時間,看看是否有人提出任何其他事情。 –

+0

正如我所說的,我的Ruby/Rails很弱,但Corey Haines有一個關於如何從Ruby代碼中抽象Rails混亂的好話題。值得檢查,就好像上面的模型依賴於ActiveRecord,你可能不得不稍微改變你的方法。見http://confreaks.net/videos/641-gogaruco2011-fast-rails-tests – Finglas

1

在這些情況下,測試代碼可能會崩潰。將其視爲失敗。

在實際開始實現此類之前,在實際代碼之前編寫測試代碼將使您可以設計受測試類的接口。你將會有一個類的使用例子,這非常棒!

之後,您將需要創建實際的測試類,並且測試將失敗,而不是崩潰。然後讓這個測試通過,重構並繼續寫入失敗的測試。

+0

+1崩潰測試*是失敗的測試。你做得很好。 TDD要求您先寫測試。 –

0

我的方法是使用 作爲該測試的條件檢查p.fullname.nil?,或者簡單地將assert_not_nil(p.fullname)作爲前面的測試,當失敗時將阻止其餘測試執行。

+0

這仍然導致NoMethod運行時崩潰,這是我試圖避免 –

+0

您的建議讓我朝着正確的方向 - 我編輯了OP,以顯示我最終在做什麼 –

+0

@MikeyHogarth,同時這幫助了你。這不是TDD,事實上這是一個相當可怕的方式去實現它。您不需要編寫自定義邏輯來決定需要聲明的內容。 – Finglas