如何遍历数组并检查对象的属性是否匹配
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_at
、updated_at
、id
等,则此测试可能会失败。在那种情况下,您可以更明确地说明您正在测试哪些属性。有很多方法可以做到这一点,例如:
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.
的一个很好的用例
我正在开发一个 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_at
、updated_at
、id
等,则此测试可能会失败。在那种情况下,您可以更明确地说明您正在测试哪些属性。有很多方法可以做到这一点,例如:
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.
的一个很好的用例