2014-04-14 64 views
1

我有一個選項哈希和一個方法來更新它 - 但是哈希選項可能會改變,如果是這樣,我希望我的測試失敗。寫這個的好方法是什麼?檢查數組中是否包含多個項目的好方法

raise RuntimeError, msg unless options.keys.include?(
    :external_uid, 
    :display_name, 
    :country_code 
) 

如果options.keys不包括這三個項目,則應該引發錯誤。

的解決方案,我幾乎使用(感謝bjhaid

def ensure_correct_options!(options) 
    msg = "Only 'external_uid', 'display_name' and 'country_code' can be " 
    msg += "updated. Given attributes: #{options.keys.inspect}" 

    raise RuntimeError, msg unless options.keys == [ 
    :external_uid, 
    :display_name, 
    :country_code 
    ] 
end 
+3

也許[這](http://stackoverflow.com/questions/8026300/ check-for-multiple-items-in-array-using-include-ruby-beginner)答案可能會有所幫助。 – Magnuss

+0

@Magnuss,歡呼聲中,我看到了,但我只想要精確匹配...我最終用一個更簡單/面對誘導解決方案。乾杯 – dax

+0

@dax,如果數組中的元素以不同的方式排序,你的解決方案會失敗,請看[Hash#fetch](http://www.ruby-doc.org/core-2.1.1/) Hash.html#method-i-fetch)具有接近你想要的行爲,但在單鍵 – bjhaid

回答

4

的選項可能有一個值,所以我會寫:

unless options[:external_uid] && options[:display_name] && options[:country_code] 
    raise ArgumentError, ":external_uid, :display_name and :country_code required" 
end 

(我把它換成RuntimeErrorArgumentError,因爲這似乎是關於論據)

+0

'options.key?(...)&& ...'可能是可取的,因爲我們不知道散列中是否允許有'nil'值。 –

1

如果有三個以上的值來測試包括如哈希鍵,你可以做t等這樣的:

unless ([:external_uid, :display_name,...] - options.keys).empty? \ 
    raise ArgumentError, ":external_uid, :display_Nam,... are required" 
相關問題