2014-04-14 7 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/ 여러 항목을 배열로 사용하기 - 루비 - 초보자 포함) 체크가 도움이 될 수 있습니다. – 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 

(나는 RuntimeError를 교체했습니다 이것은 인수에 관한 것 같으므로 ArgumentError으로 표시)

+0

'options.key? (...) && ...' 'nil' 값이 해시에서 허용되는지 여부를 알 수 없기 때문입니다. –

1
해시의 키와 포함을 테스트하기 위해 개 이상의 값이 있다면, 당신이 그것을 할 수

t이 맘 :

unless ([:external_uid, :display_name,...] - options.keys).empty? \ 
    raise ArgumentError, ":external_uid, :display_Nam,... are required" 
관련 문제