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

How to iterate through an array and check that attributes for an object match

我正在开发一个 Ruby 脚本来解决从应用程序中意外删除的用户问题,该脚本会在删除前克隆用户记录和用户组。

我正在遍历这两个对象,现在正试图弄清楚如何断言属性匹配。

我试过了

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

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.

的一个很好的用例