2011-08-14 13 views
3

私はRSpecが好きで、配列には配列に関係なく配列の特定の要素が含まれていることを確認するために配列演算子matcherが本当に好きです。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です。 RSpecは、返される順序にかかわらず、ActiveRecordオブジェクトのコレクションを検証するためのより良い方法を提供していますか?あるいは、少なくともそのようなテストをコード化するためのよりきれいな方法がありますか?

+1

ていますが、 '@のd.flea_ids'ではなく、マッピングを行うことができます。 –

+0

真実ですが、あなたのアプローチでは、ほんのりとしたものです。:) –

答えて

4

ActiveRecord :: Relationsは、(あなたが見つけた)配列のようには機能しません。 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 –

関連する問題