簡體   English   中英

如何在長生不老葯中模擬當前時間

[英]How to mock current time in elixir

我有一些取決於當前時間的測試,到目前為止我無法找到解決方案。 我嘗試了一些mock庫,如mock但它mock了整個模塊並且失敗了。 任何幫助將不勝感激(如果我只模擬DateTime.utc_now一切正常)

注意:測試在很大程度上依賴於其他DateTimeDate函數,因此模擬整個模塊不是一個很好的選擇(我也嘗試過,但由於非常復雜的情況而失敗,我在許多測試中都需要這樣做)

實際測試:我有兩個日期, start dateend date作為我要測試的函數的輸入。 在調用該函數進行測試之前,我插入了一些與當前周(當前數據到接下來的 7 天)相關的數據。 現在該函數將獲取當前日期時間並檢查特定日期(每條記錄將說明它是否適用於一周中的當前日期以及迭代的當前時間段范圍 - > 開始和結束日期)。 例如,一條記錄適用於mon -> 2:12 到 3:13

最適合我的需求的解決方案(簡單、運行良好並符合上述要求)是:

定義您自己的函數/服務MyDateTime.utc_now/0並在您的測試中模擬它。 參考

注意這個答案自 Elixir v1.8 起已過時現在默認參數不在編譯時評估。 積分@HentikN。

現在該函數將獲取當前datetime並檢查特定日期 [...]

這才是真正的問題所在。 您無緣無故地使您的功能不純。 通常純度意味着函數沒有副作用,但盲目地根據外部世界改變結果聽起來也不是一種穩健的方法。

也就是說,你應該讓這個函數now或像這樣接受一個參數(為了簡潔起見,它可能默認為now ):

- def my_func(param) do
+ def my_func(param, dt \\ nil) do
+   dt = if is_nil(dt), do: DateTime.utc_now(), else: dt

(Naïve dt \\\\ DateTime.utc_now()將不起作用,因為函數頭是在編譯時評估的。)

現在,在您的測試中,您可能會根據您想要的時間調用此函數,並且(這更重要)您的函數不再是依賴於外部無關條件的黑盒。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM