2013-06-30 4 views
2

루비 함수가 여러 개인 경우 입력이 올바른지 입력이 올바른지 확인하고 싶습니다. 그것을 할 수있는 합리적인 방법은 무엇입니까? how to put assertions in ruby code :루비에서 함수 입력을 테스트하는 적절한 방법은 무엇입니까?

는 여기에 내가

# Converts civil time to solar time 
# civilT: Time object 
# longitude: float 
# timezone: fixnum 
def to_solarT(civilT,longitude,timezone) 
    # pseudo code to check that input is correct 
    assert(civilT.class == Time.new(2013,1,1).class) 
    assert(longitude.class == 8.0.class) 
    assert(timezone.class == 1.class) 

    # More pseudocode to check if the inputs makes sense, in this case 
    # whether the given longitude and timezone inputs make sense or whether 
    # the timezone relates to say Fiji and the longitude to Scotland. Done 
    # using the imaginary 'longitude_in_timezone' function 
    assert(longitude_in_timezone(longitude,timezone)) 
end 

내가 여기에 관련 질문을 찾아 확인하고 싶은 내가 가지고있는 기능과 무엇 하나의 예입니다. 이것이 루비의 함수 입력을 테스트하는 더 좋은 방법인가요?

+1

'1.class'는 나를 떨게 만든다. 'Time.new.class'는 내가 비명을 지르고 headdesk하고 싶게 만든다. –

+1

프로그램이 메서드 시그니처에 유효한 값을 전달하는 것을 신뢰하지 않는 이유는 무엇입니까? 오염 된 데이터를 다루지 않는 한 단원 테스트 또는 예외에 의존하십시오. –

답변

3

assert은 표준 루비 메서드가 아니며 테스트 프레임 워크에서 자주 사용되므로 코드에 넣는 것이 좋지 않을 것이라고 생각합니다. 또한 인수를 검사 할 클래스의 인스턴스를 만드는 것도 의미가 없습니다. 더 똑 바르게,

def to_solarT civilT, longitude, timezone 
    raise "Argument error blah blah" unless Time === civilT 
    raise "Argument error blah blah" unless Float === longitude 
    raise "Argument error blah blah" unless Fixnum === timezone 
    ... 
end 
+0

좋아, 내가 원했던. 감사 – pandita

3

이렇게하면 안됩니다. 루비는 오리 타이핑에 크게 의존합니다. 즉, 오리처럼 qu아 먹으면 그것은 오리입니다. 즉, 수신 한 객체 만 사용하면 제대로 응답하면 괜찮습니다. 그렇지 않으면 NoMethodError를 구하고 적절한 출력을 표시 할 수 있습니다.

+0

감사합니다. @pedro는 나를 타이핑하는 것을 가리키며 .... 그것에 대해 들었고, 지금까지 무시했지만, 그것이 의미하는 바를 볼 것입니다. – pandita

+0

오리 타이핑 (Duck typing)은 어떤 것이 특정 클래스에 속하는지에 대해별로 신경 쓰지 않는 것입니다. 단지 행동을 기대합니다. 그럼 그냥 돌팔매질 해달라고 부탁해. 당신이 방법 돌연변이 체를 사용하고 기 싶기 때문에 오리 인 경우에 사문하지 말라. –

+1

아하 ... 잘 이해하기가 너무 힘들지 않아. :) 환호 – pandita

관련 문제