2010-12-14 2 views
3

Я пишу тесты, и мне интересно, есть ли способ изменить текущую дату во время моего теста?имитирует текущую дату во время тестов

Дело в том, что я тестирую статистическую функциональность приложения, которая связана с моделью отслеживания, которая создает экземпляр при каждом вызове действия (только некоторые действия отслеживаются с помощью вызова «только до появления фильтра»)

Поэтому мне нужно называть это действиями в другом контроллере в различных точках во время, чтобы проверить мой аналитик компоненты делают правильные расчеты, но я не нашел способ реализации 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

Для этого есть куча драгоценных камней. Мой любимый бизнес: https://github.com/bebanjo/delorean

+0

Даст дополнительную престижность для котировки спины к FUTUR, я люблю использовать этот драгоценный камень! – standup75

1

Один из способов проведения такого рода испытаний заключается в моделировании метода/класса вы хотите протестировать.

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

Идея, что вы можете создать идентичную функцию, для передачи в дату вместо того, чтобы полагаться на текущую дату, за исключением, и тест, который вместо этого. Трудность заключается в том, чтобы убедиться, что две функции действительно эквивалентны и сохраняют любые изменения в синхронизации.

Есть существующие рамки и такие там, чтобы насмехаться, но я не очень хорошо знаком с ними, чтобы рекомендовать их вам.

0

В Rails есть жемчужина для насмешки.
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 
Смежные вопросы