2011-01-21 27 views
18

Rspecでは、idを無視して2つのActiveRecordオブジェクトを比較する良い方法がありますか?& c?たとえば、XMLから1つのオブジェクトを解析して、フィクスチャからもう1つのオブジェクトを読み込んでいるとします。私がテストしているのは、XMLパーサが正しく動作することです。私が現在持っているのはActiveRecordオブジェクトとRspecの比較

actual.attributes.reject{|key,v| %w"id updated_at created_at".include? key } == expected.attributes.reject{|key,v| %w"id updated_at created_at".include? key } 

のカスタムマッチャーですが、もっと良い方法があるのだろうかと思っています。

もう少し複雑ですが、に同じようなことをする方法があります? XMLパーサーは元のオブジェクトに属しているいくつかのオブジェクトも作成すると言っています。 idがcreated_at、& cであることを除いて、結局私は結局同じものになるはずです。私は、サイクリングだけでなく、それらの変数をクリアしてチェックするという良い方法があるのだろうかと思います。

答えて

25

上記を書くための短い方法はactual.attributes.except(:id, :updated_at, :created_at)です。

あなたはこれをたくさん使用している場合は、常にこのよう独自のマッチャーを定義することができます。

User.first.should have_same_attributes_as(User.last) 

グッド:

RSpec::Matchers.define :have_same_attributes_as do |expected| 
    match do |actual| 
    ignored = [:id, :updated_at, :created_at] 
    actual.attributes.except(*ignored) == expected.attributes.except(*ignored) 
    end 
end 

は、あなたのspec_helper.rbあなたが今どの例で言うことができるにこれを入れて運。

+4

私はそれだけで引用符 '[" "id"、 "updated_at"、 "created_at"] ' – zishe

+1

を使って文字列とシンボルの両方で動作させるには、HashWithIndifferentAccess:' actual.attributes.with_indifferent_access.except 'を使用できます。 .. '。 – mrzasa

+1

私はこれを試して ''未定義のメソッド ''属性 ''を取得します。何が間違っていますか? –

関連する問題