2011-06-26 74 views
25

我是測試Rails Web應用程序和RSpec的新手。我使用遺留代碼並需要添加測試。那麼用RSpec測試查找器和命名範圍的最好方法是什麼?Rails:使用RSpec測試命名範圍

我在Google上找到了一些方法,但它們並不理想。 例如:

http://paulsturgess.co.uk/articles/show/93-using-rspec-to-test-a-named_scope-in-ruby-on-rails

it "excludes users that are not active" do 
    @user = Factory(:user, :active => false) 
    User.active.should_not include(@user) 
end 

http://h1labs.com/notebook/2008/8/21/testing-named-scope-with-rspec

it "should have a published named scope that returns ..." do 
    Post.published.proxy_options.should == {:conditions => {:published => true}} 
end 

我覺得最好的辦法(恕我直言)在 「軌道測試方」:

should_match_find_method :active_only { :active == true } 

其中should_match_find_method定製幫手方法

+2

範圍測試是真正的經驗,我堅持你在這裏公開的第一種方法 – apneadiving

+4

我同意。第一種方法有什麼問題?它規定了真正的行爲,而不是檢查(實際上只是重寫)可能有缺陷的配置參數。 –

+0

@RobDavis「可能有缺陷的配置參數」+1 –

回答

29

RSpec的創建者最近在博客中提到他認爲Validations are behavior, associations are structure。換句話說,他發現協會(和範圍)不應該直接進行測試。測試這些將從你想要的行爲出發。

換句話說,目前的觀點是,不需要直接測試每個範圍,因爲您將通過測試應用程序的行爲來覆蓋這些關聯。

+32

他在那篇文章中沒有提到範圍,但是,你爲什麼要把它們與協會聯繫起來?與協會相比,範圍可能更加複雜且容易出錯,我相信應該進行測試。既然你調用了強大的創造者,[這裏](http://groups.google.com/group/rspec/browse_thread/thread/6706c3f2cceef97f),他建議如果一個範圍屬於行爲保護傘(如果它不,它爲什麼在那裏?),那麼它應該被指定。 –

+3

我不反對不應該測試範圍。他們絕對應該。只是不直接;範圍的測試應該通過測試應用程序的行爲來驅動。我將範圍視爲與關聯類似,因爲兩者都可以具有複雜的選項,如連接,包含模型,其中/ group by/having等等。無論如何,這對我來說是有意義的。 –

0

第一種方法的問題是它實際上查詢數據庫。這是緩慢和不必要的。如果你不介意,你可以安全地使用第一種方法。第二種方法是快速和明確的,所以我會推薦它。

+2

您確定在模型規範中查詢不必要嗎?我可以理解,不要在控制器中查看它,或者查看spec - mock&stub it away。但我認爲你想在這裏測試模型及其與數據庫的關係。 – jaydel

+0

IMO測試命名的作用域時不需要。你應該有很多其他的測試可以從數據庫中讀取。 –

+14

作用域是查詢數據庫來獲取真實對象的一個​​區域。我贊成在適當的地方嘲笑,但只有最簡單的範圍才能用於嘲笑。一旦你開始加入或分組,他們就會崩潰,我已經制定了一個規則來測試範圍與真實的後備商店。基於配置的匹配器(如第二個和第三個示例)容易出錯,恕我直言。也就是說,他們很可能與您的代碼具有相同的錯誤。 –