今天遇到的例子,記錄一下。

原本是單純呼叫 time() 的程式,所以在測試的時候總是會遇到預期的資料比實際跑的資料快一秒或慢一秒的問題。

之前不曉得怎麼解,於是先在測試群組標記了 @group timestamp-flaky 做記號。

今天偶然間看到自己有在用的套件 Carbon 內建的測試函式 setTestNow() ,試了一下可以滿足需求。

首先是把程式裡呼叫到 time() 的部份改用 Carbon::now() 代替。

在測試的 setUpBeforeClass() 使用 Carbon::setTestNow() 指定一個想要換掉的時間,例如

$mock_now = Carbon::parse('12/31 23:45');
Carbon::setTestNow($mock_now);

這樣在測試裡只要呼叫 Carbon::now() 都會是指定的時間 $mock_now 了。

測試完的恢復也很簡單,在 tearDownAfterClass() 重設就好:

Carbon::setTestNow();

改完以後使用 phpunit --repeat 1000 檢查了一下,就沒看到快一秒慢一秒的問題了。


文章標籤

repeat :D 發表在 痞客邦 留言(0) 人氣()