2017-03-24 110 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匹配是通用的,可用於字符串,數組,哈希等

在這種情況下,你可以遍歷記錄並比較它們的屬性哈希:

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

不過,如果你有不同的created_atupdated_at,012這個測試可能會失敗,等檔案與刪除記錄。在這種情況下,您可以更明確地指出要測試的屬性。有很多方法可以做到這一點,但例如:

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'沒有在任何地方定義。這有點凌駕於我的頭上,因此我試圖將其分解,但一眼就看出它拋出未定義的方法「屬性」。 – VegaStudios

+0

@VegaStudios我的壞在那裏有一個錯字刪除'archived_user_groups'周圍的數組 –

+0

Minitest使用'expect',還是RSpec方法? – VegaStudios

相關問題