2013-08-28 137 views
1

爲什麼要使用stub因爲你應該反正測試真正的類使用?Rspec的存根,爲什麼在所有

我知道有一些你不想要測試的其他類,而不是去通過其他相關類的方法,但我仍然認爲這是更好地使用真正的方法的情況。

我真的只能看到一個好處,當你想快速跳過一個方法的其他相關任務和返回最終結果在測試中使用

是否還有其他的好處,雖然我們應該考慮?

(除了上面我也覺得stub是有風險的藏漢因爲你的代碼可以改變,因爲它的發展和可能產生不同的輸出到它在測試中產生)

+1

瓶頸使用存根是磕碰錯誤的東西一樣簡單。它們在幫助避免觸及數據庫方面非常出色,或避免觸及可能不會生成的相關數據。如果你是單元測試,存根通常是一個很好的工具。單元測試應該很簡單,他們不需要測試所有相關的數據或應用這些數據的過程。扼殺正確的事情是人們通常會犯錯的。 –

+0

在嚴重的大型企業應用中的任何變化不大,是非常敏感的,豈不是更好地避免'stub'和而實際上與數據庫的交互藏漢測出來? (帶有測試數據庫和測試數據) –

回答

1

這取決於測試你是執行。對於單元測試,只測試單個類,存根是有益的。

舉個例子,假設當其他一些物體結束did_it!操作要測試時發送電子郵件類:

describe Emailer do 
    context ".send_email" do 
    it "sends an email if another object 'did_it!'" do 
     obj = Obj.new 
     Emailer.send_email(obj).should == true # the email sends successfully 
    end 
    end 
end 

在這種情況下,如果obj.did_it!是一個超級昂貴的操作,也可能會失敗間歇地,這個測試可能會有問題。

然而,在這個測試中,我們只關心Emailer.send_email運行正常時obj.did_it!回報true - 我們不關心的obj.did_it!方法可行,因爲這不是我們正在測試。

所以,我們使用存根說,「假設obj.did_it!成功,並Emailer.send_email實際發送電子郵件?」:

describe Emailer do 
    context ".send_email" do 
    it "sends an email if another object 'did_it!'" do 
     obj = stub(:did_it! => true) 
     Emailer.send_email(obj).should == true # the email sends successfully 
    end 
    end 
end 
相關問題