【发布时间】:2021-04-14 05:17:34
【问题描述】:
背景
我有一组测试需要先启动 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 中的初始化时间很长,因此测试在服务器准备好之前运行。
问题
我该如何解决这个问题?
【问题讨论】:
标签: elixir gen-server ex-unit