Как смоделировать текущее время в эликсире - PullRequest
0 голосов
/ 14 октября 2018

У меня есть несколько тестов, которые зависят от текущего времени, и я пока не могу найти решение для этого.Я пробовал некоторые насмешливые библиотеки, такие как mock, но он высмеивает весь модуль и не работает.Любая помощь будет по достоинству оценена (если я только высмеиваю DateTime.utc_now, все в порядке)

Примечание: тесты сильно зависят от других функций DateTime и Date, поэтому имитация целых модулей не очень хорошая опция (Я пробовал это тоже, но не смог из-за очень сложных случаев, и мне нужно это во многих тестах)

Фактический тест: у меня есть две даты, start date и end date в качестве входных данных для функции, которую я пытаюсьтестировать.Перед вызовом функции в целях тестирования я вставляю некоторые данные, релевантные для текущей недели (текущая дата для следующих семи дней).Теперь функция получит текущее время и проверит определенные дни (каждая запись сообщит, относится ли она к текущему дню недели и к диапазону текущего периода времени, для которого выполняется итерация -> даты начала и окончания).например, одна запись относится к mon -> 2:12 до 3:13

Ответы [ 2 ]

0 голосов
/ 14 октября 2018

Решение, которое наилучшим образом соответствует моим потребностям (простое, работает хорошо и в соответствии с требованиями, описанными выше):

определите свою собственную функцию / службу MyDateTime.utc_now/0 и смоделируйте ее в своих тестах.- Ссылка .

0 голосов
/ 14 октября 2018

Теперь функция получит текущее значение 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

(Наивное dt \\ DateTime.utc_now() не будет работать, потому что функциональные головки оцениваются на время компиляции .)

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

...