最近做面試題認識Timecop,Timecop是一個控制時間的套件,怎麼個控制法呢?
freeze、travel
freeze是把設定的時間凍住,同時我們的Time.now也會變成freeze的時間,10秒之後(再次提醒自己:sleep會放10秒再繼續執行,不是當機啦!)再使用一次Time.now並不會改變時間,和剛才設定的new_time相同。
1 | new_time = Time.local(2008, 9, 1, 12, 0, 0) |
而travel是會把我們的時間(Time.now)改成new_time設定的時間,並且開始「流動」,跟freeze不一樣的地方就是new_time和Time.now不會相同,因為new_time的時間是寫死的,而Time.now會一直改變。
1 | new_time = Time.local(2008, 9, 1, 12, 0, 0) |
從github挖出來的freeze和travel可用引數
1 | 1. Timecop.freeze(time_inst) |
另外爬到的文還有do end用法,在scope裡的都會受到Time.freeze及travel的影響,假設時間是10:00,經過第一層的1.hours之後時間就會前進一個小時、回溯可以用1.hours.ago,時間函數似乎都可以用(這個我不太確定),再經過這個scope裡的Timecop.travel 30.minutes,時間將會再更前推30分鐘。
1 | Timecop.freeze(Time.zone.local(2023, 1, 31, 10, 0)) |
return
改時間如果有需要復原成正常時間的話,可以使用 Timecop.return
scale
可以縮放時間刻度的比例,scale的引數就是一秒可以當幾秒過
1 | Timecop.scale(60) do |
before、after
在before跟after之間的時間都會受到Timecop影響,不過這次我自己用是拿來設定時區的(不知道是不是OK的做法)
1 | describe "some set of tests to mock" do |
補充:當我跟Timecop初次見面
當我第一次使用Rspec+Timecop跟在深山走丟一樣,不知道是哪裡缺了漏了,報不完的錯,甚至都還沒碰到邏輯就錯了,記錄一下以免太久不碰又忘記(哭
- 如果在Rspec使用Timecop會報這個錯誤,在文件上方補上
require "timecop"
引入就能正常使用了。1
2
3
4
5
6Failure/Error: Timecop.travel(Time.zone.local(2023, 1, 31, 5, 0))
NameError:
uninitialized constant Timecop
Timecop.travel(Time.zone.local(2023, 1, 31, 5, 0)) - 在使用時間函數老是說undefined method,除了這裡的zone還有上面提過的hours、minutes等,這個問題的解決辦法也是在文件上方補上
require "active_support/all"
就能正常使用。1
2
3
4
5
6Failure/Error: Time.zone = "Asia/Taipei"
NoMethodError:
undefined method `zone=' for Time:Class
Time.zone = "Asia/Taipei"
參考資料:Timecop 官方文件
用 Timecop 自由穿梭時間軸
碎念:哎…小白剛踏出新手教學真是什麼都不知道,慢慢來(深呼吸