如何遍历数组并检查对象的属性是否匹配

时间:2017-03-24 15:20:29

标签: ruby-on-rails ruby minitest

我正在研究一个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 个答案:

答案 0 :(得分:1)

include匹配器功能多样,可用于字符串,数组,哈希等。

在这种情况下,您可以迭代记录并比较它们的属性哈希值:

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

但是,如果您对归档与已删除记录有不同的created_atupdated_atid等,则此测试可能会失败。在这种情况下,您可以更明确地了解您正在测试哪些属性。有很多方法可以做到这一点,例如:

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的好用例。