2017-03-24 10 views
0

Rubyスクリプトを使用して誤ってアプリケーションから削除されたユーザのレコードとUserGroupsを削除前に複製する作業をしています。配列を反復処理し、オブジェクトの属性が一致するかどうかをチェックする方法

私は両方のオブジェクトをループしていますが、今は属性が一致することをどのようにアサーションするかを考えようとしています。

私は

assert_equal archived_user_groups, deleted_user_groups 

を試してみましたが、それはオブジェクトではありません属性がアサートされ、それが失敗しました。

私は配列をループし、その属性(user_id、group_id)が同じインデックス(0,1,2、...)のすべてのオブジェクトで同じであることを確認しようとしています。 each_with_indexはこれに適しており、どのように実装されますか?

archived_user_groups_test.rb:

def test_user_with_user_groups 
    user = users(:employee_bb) 
    deleted_user_groups = user.user_groups.sort_by{ |u| [u.user_id, u.group_id] } 

    user.archive! 

    archived_user_groups = ArchivedUserGroup.where(user_id: user.id).sort_by{ |u| [u.user_id, u.group_id] } 

    deleted_user_groups.each do |ug| 
     archived_user_groups.find do |attribute_names, attribute_values| 
     assert_equal archived_user_groups, deleted_user_groups 
     end 
    end 

    end 

答えて

1

includeマッチャが汎用性があり、文字列、配列、ハッシュのために使用することができる、など

この場合、あなたは、レコードを反復し、その属性を比較することができハッシュ:あなたは別のcreated_atupdated_at、012を持っている場合

archived_user_groups.each_with_index do |archived_user, idx| 
    expect(archived_user.attributes).to include(deleted_user_groups[idx].attributes) 
end 

しかしこのテストは失敗することがありますなど、アーカイブ対削除レコードです。その場合は、どの属性をテストしているかをより明確にすることができます。これを行うが、例えばするには多くの方法があります。

archived_user_groups.each_with_index do |archived_user, idx| 
    expect(
    archived_user.attributes.values_at("id", "email") 
).to match_array(
    deleted_user_groups[idx].attributes.values_at("id", "email") 
) 
end 

私は、これは潜在的にワンライナー何ができるかについて、詳細思わ認めます。これは、custom matcherを書くための良いユースケースかもしれません。

+0

'archived_user'は' archived_user_groups'ですか? 'archived_user'はどこにも定義されていないからです。これは私の頭を少し上回っているので、私はそれを分解しようとしていますが、一見すると未定義のメソッド 'attributes 'が投げられています。 – VegaStudios

+0

@VegaStudiosそこに誤字がありました。 'archived_user_groups'の周りに配列を削除しました。 –

+0

Minitestは' expect'を使用していますか、それともRSpecメソッドですか? – VegaStudios

関連する問題