Недавно выпущенный Test::Redef
делает этот и другие подделки простыми даже без реструктуризации кода в стиле внедрения зависимостей (особенно полезно, если вы используете другие люди). 'код.)
fake_time = Time.at(12345) # ~3:30pm UTC Jan 1 1970
Test::Redef.rd 'Time.now' => proc { fake_time } do
assert_equal 12345, Time.now.to_i
end
Однако, будьте осторожны с другими способами получить время, чтобы оно не выдалось (Date.new
, скомпилированное расширение, которое делает свой собственный системный вызов, взаимодействует с такими вещами, как внешние серверы баз данных, которые знают текущие метки времени и т. Д.) Похоже, что приведенная выше библиотека Timecop может преодолеть эти ограничения.
Другие замечательные применения включают в себя тестирование таких вещей, как «что происходит, когда я пытаюсь использовать этот дружественный http-клиент, но он решает вызвать это исключение вместо того, чтобы возвращать мне строку?» без фактической настройки условий сети, которые приводят к этому исключению (что может быть сложно). Он также позволяет проверять аргументы для переопределенных функций.