我正在研究一个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
答案 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_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的好用例。