2011-08-14 23 views
3

我喜歡RSpec,並且我非常喜歡它的=~數組運算符匹配器來驗證數組是否包含一組特定的元素,而不管其排序如何。如何在rspec中測試ActiveRecords的集合?

但是這並不奇怪,它測試指針平等,沒有平等的內容,所以下面將不工作:

class Flea < ActiveRecord::Base ; end 
class Dog < ActiveRecord::Base 
    has_many :fleas 
end 

@d = Dog.create 
@d.fleas << (@f1 = Flea.create) 
@d.fleas << (@f2 = Flea.create) 

@d.fleas.should =~ [@f1, @f2] 

所以我發現自己經常在我的RSpec的測試寫這個:

@d.fleas.map {|f| f.id}.should =~ [@f1.id, @f2.id] 

bad code smell的reeks。 RSpec是否提供了一種更好的方式來驗證ActiveRecord對象的集合,而不管返回的順序如何?或者至少有更好的方法來編寫這樣的測試?

+1

不把這個作爲一個答案,因爲我相信它也氣味,但你可以做'@ d.flea_ids'而不是映射。 –

+0

是的,但在你的方法是一個比一個reek更味道... :) –

回答

4

ActiveRecord ::關係不像陣列(就像你發現的那樣)。見Issue #398 on the GitHub RSpec-Rails Issue board

答案是,這行代碼添加到您的spec_helper.rb

RSpec::Matchers::OperatorMatcher.register(ActiveRecord::Relation, '=~', RSpec::Matchers::MatchArray) 
+0

哦,這是*所以*作弊!我的意思是,我希望我已經想到了第一個:)好的工作。 –

+0

可愛。它的工作原理。謝謝! (從RSpec鏈接中,顯然你也可以執行'[*@d.fleas] .should =〜[@ f1,@ f2]',但註冊匹配器似乎是更好的方法。) –

+2

FYI:https:// github.com/rspec/rspec-rails/issues/398 –