2010-04-18 73 views
3

我把大部分時間花在靜態類型語言(主要是C#)上。由於靜態方法以及實體和數據訪問代碼的混合,我對Active Record模式和單元測試有一些不好的經驗。ActiveRecord是否讓Ruby on Rails代碼難以測試?

由於Ruby社區可能是社區最受測試驅動的,而且Rails ActiveRecord看起來很流行,所以在Ruby on Rails中必須有某種方式來結合基於TDD和ActiveRecord的代碼。

我猜想問題在動態語言中消失了,但我不知道如何。那麼,有什麼竅門?

回答

2

訣竅是你不需要詭計。您可以在測試中創建ActiveRecord實例。查看here瞭解如何在Rails中使用簡單測試的一些基本步驟。

您可以閱讀Rails官方testing guide,以在Rails中構建一些關於TDD的想象。另外看看另外兩個流行的測試框架RSpec(我的最愛,手錶mocking screencast)和Shoulda

+0

感謝您的鏈接。因此,讓單元測試在RoR中擊中數據庫而不是模擬數據訪問是標準做法。如果是這種情況,我可以看到沒有問題,因爲根據我的經驗,ActiveRecord的問題是很難模擬。 – 2010-04-18 18:48:59

+1

不,不難嘲笑。 而您在測試過程中僅擊中TEST環境數據庫(擊中時)。但是當你不想要的時候,你不需要打一個數據庫。 – retro 2010-04-18 19:05:16

+1

一篇有趣的文章:http://misko.hevery.com/2009/05/05/the-problem%20-with-active-record/ – 2010-04-19 05:45:28

3

問題是燈具太可怕了。前一段時間,我讀了一篇叫做The Lie的文章,它睜開了眼睛。本文重點介紹了Machinist,我已經使用過並喜歡它,但目前我更喜歡factory_girl。下面是從他們的README一個基本的例子:

您定義一個與剛剛夠默認值的工廠,讓您的測試通過:

# This will guess the User class 
Factory.define :user do |u| 
    u.first_name 'John' 
    u.last_name 'Doe' 
    u.admin false 
end 

然後在你的測試,你可以重寫或根據需要添加值(做作RSpec的例子)

describe User, "#is_admin?" do 
    before(:each) do 
    @user = Factory(:user, :admin => true, :email => '[email protected]') 
    end 

    it "should be true" 
    @user.is_admin?.should be_true 
    end 
end 

@user現在是一個真實的,生活,工作ActiveRecord的模式,住(暫時)在測試數據庫中。您也可以在控制器測試中使用工廠。你可能嘲笑他們,但在我有限的經驗,這項工作是不值得的小的性能增益。大多數情況下,當我需要測試一個條件時,我嘲笑(save即使記錄是有效的,以便我可以測試失敗的條件返回false)。

在使用這裏提到的兩個庫後,您不能再支付我使用fixtures。