2010-12-14 4 views
3

테스트를 쓰고 있으며 테스트 중에 현재 날짜를 변경할 수있는 방법이 있는지 궁금합니다.테스트 중 현재 날짜 시뮬레이션

요점은 동작이 호출 될 때마다 인스턴스를 만드는 추적 모델에 연결된 응용 프로그램의 통계 기능을 테스트한다는 것입니다 ("before_filter only"호출을 통해 일부 동작 만 추적 됨)

그래서 난 내 분석 구성 요소가 바로 계산을하고 테스트하는 시간에 다른 지점에서 다른 컨트롤러에서이 작업을 호출해야합니다,하지만 난 다음 샘플 코드에서 change_current_time 구현할 수있는 방법 찾을 수 없습니다 :

test "login count" do 
    change_current_time(2.day.ago) 
    get "users/login/testuser/testpassword" 
    assert login_count(2.day.ago) == 1 
    change_current_time(1.day.ago) 
    get "users/login/testuser/testpassword" 
    get "users/login/testuser1/testpassword1" 
    assert login_count(1.day.ago) == 2 
end 

답변

5

이런 종류의 일을하기위한 보석이 많이 있습니다. 내가 가장 좋아하는 것은 delorean이다 : https://github.com/bebanjo/delorean

+0

가 FUTUR 다시의 견적 여분의 명성을 줄까요,이 보석을 사용하여 사랑! – standup75

1

이러한 유형의 테스트를 수행하는 한 가지 방법은 메소드/클래스를 모방하는 것입니다. 너는 시험하고 싶어.

http://en.wikipedia.org/wiki/Mock_object

아이디어는 날짜를 전달하는 대신 현재 날짜에 의존을 제외하고 동일한 기능을 만들 수 있으며, 대신 테스트하는 것이. 어려움은 두 기능이 실제로는 동등한 지 확인하고 동기화를 통해 변경 사항을 유지하는 데 있습니다.

조롱을위한 기존 프레임 워크와 아웃이 있지만, 나는 그들에게 당신에게 하나를 추천하기에 충분히 친숙하지 않습니다.

0

레일에 조롱하는 시간에 대한 보석이있다.
https://github.com/harvesthq/time-warp

time = (2.days.ago) 

pretend_now_is(time) do 
    get "users/login/testuser/testpassword" 
    assert login_count(Date.today) == 1 # it's stubbed 
end 

time = (1.days.ago) 

pretend_now_is(time) do 
    get "users/login/testuser/testpassword" 
    get "users/login/testuser1/testpassword1" 
    assert login_count(Date.today) == 2 
end