Фон
У меня есть набор тестов, для которых требуется запуск GenServer. Как правило, я понимаю, что рекомендуется выполнять очистку после каждого теста, поэтому я также хочу останавливать GenServer после каждого теста.
Проблема
Проблема здесь в том, что я не знаю, как остановить GenServer после завершения теста. Я всегда сталкиваюсь с проблемой параллелизма.
defmodule MyModuleTest do
use ExUnit.Case
alias MyModule
setup do
MyModule.Server.start_link(nil)
context_info = 1
more_info = 2
%{context_info: context_info, more_info: more_info}
end
describe "some tests" do
test "returns {:ok, order_id} if order was deleted correctly", context do
# do test here that uses created server and passed context
assert actual == expected
#clean up?
end
end
end
Теперь я попробовал on_exit
/2 следующим образом:
setup do
{:ok, server} = MyModule.Server.start_link(nil)
context_info = 1
more_info = 2
on_exit(fn -> GenServer.stop(server) end)
%{context_info: context_info, more_info: more_info}
end
Но я получаю эту ошибку:
** (exit) exited in: GenServer.stop(#PID<0.296.0>, :normal, :infinity)
** (EXIT) no process: the process is not alive or there's no process currently associated with the given name, possibly because its application isn't started
У меня такое чувство, что это заканчивается слишком рано.
Я также пытался использовать start_supervised
, однако, поскольку мой GenServer
имеет длительную инициализацию в handle_continue
тесты запускаются до того, как сервер будет готов.
Вопрос
Как я могу это исправить?