Ответ 1
Elixir
Я предлагаю вам реализовать это путем инъекции зависимостей. Например (используя новый API времени в Erlang 18):
defmodule Thing do
def do_stuff(data), do: do_stuff(data, &:erlang.system_time/0)
def do_stuff(data, time), do: {data, time.()}
end
В ваших тестах вы можете легко заменить временной код:
defmodule ThingTest do
use ExUnit.Case
test "the time" do
assert do_stuff("data", fn -> 123 end) == {"data", 123}
end
end
Erlang
Здесь соответствующий способ сделать это в Erlang:
-module(thing).
-export([do_stuff/1, do_stuff/2]).
do_stuff(Data) -> do_stuff(Data, fun erlang:system_time/0).
do_stuff(Data, Time) -> {Data, Time()}.
И тест:
-module(thing_tests).
-include_lib("eunit/include/eunit.hrl").
do_stuff_test() ->
?assertEqual({"data", 123}, do_stuff("data", fun() -> 123 end).