View Slide
defmodule RollingAverage douse GenServerdef start_link(limit), do: # ...def add(pid, n), do: # ... def average(pid), do: # ...end
test "add/2" do{:ok, pid} = RollingAverage.start_link()RollingAverage.add(pid, 3)# Now what?end
test "add/2 and average/1" do{:ok, pid} = RollingAverage.start_link(2)RollingAverage.add(pid, 3)RollingAverage.add(pid, 4)assert RollingAverage.average(pid) == 3.5RollingAverage.add(pid, 5)assert RollingAverage.average(pid) == 4.5end
defmodule RollingList dodef new(limit), do: {limit, []}def add({limit, list}, n), do: # ...def average({_limit, list}), do: # ...end
test "add/2" dorolling_list = RollingList.new(2)assert RollingList.add(rolling_list, 3) =={_limit = 2, [3]}end
test "add/2" do{:ok, pid} = RollingAverage.start_link(2)RollingAverage.add(pid, 3)state = :sys.get_state(pid)assert state == {_limit = 2, [3]}end
test "add/2 and average/1" do{:ok, pid} =start_supervised({RollingAverage, _limit = 2})# Same as beforeend
def background_work doTask.start(fn ->do_something()end)end
def background_work(parent, ref) doTask.start(fn ->do_something()send(parent, {ref, :done})end)end
test "background_work/0" doref = make_ref()background_work(self(), ref)assert_receive {^ref, :done}end
def background_work doTask.start(fn ->:ok = twitter_module.post()end)end
test "background_work/0" doparent = self()ref = make_ref()Mox.expect(TwitterMock, :post, fn ->send(parent, ref):okend)background_work()assert_receive ^refend
defmodule WeatherChecker douse GenServerdef init(_) do:timer.send_interval(5000, self(), :tick)enddef handle_info(:tick, _) docheck_weather()endend
test "checking weather periodically" do{:ok, _pid} = WeatherChecker.start_link()Process.sleep(5000 * 1.5)assert weather_checked?()end
defmodule WeatherChecker douse GenServerdef init(_) do:timer.send_interval(5000, self(), :tick)enddef tick(pid), do: send(pid, :tick)def handle_info(:tick, _) docheck_weather()endend
test "checking weather periodically" do{:ok, pid} = WeatherChecker.start_link()WeatherChecker.tick(pid)assert weather_checked?()end
defmodule WeatherChecker douse GenServerdef init(:interval) do:timer.send_interval(5000, self(), :tick)enddef init(:manual) do# No send_intervalendend
@mix_env Mix.env()def start(_type, _args) doSupervisor.start_link(children(@mix_env), ...)enddefp children(:test), do: [...]defp children(_env), do: [WeatherChecker | ...]
test "cleanup after crashes" doProcess.flag(:trap_exit, true){:ok, pid} = start_supervised(MyServer)Process.exit(pid, :kill)assert cleanup_successful?()end