ijt*_*ijt 10 elixir erlang-otp
通过入门教程的主管和应用程序部分,我正在为底部的监督树问题编写单元测试.我尝试启动顶级主管,但失败了,出现此错误:
1) test all buckets die if registry dies (KV.SupervisorTest)
test/kv/supervisor_test.exs:4
** (EXIT from #PID<0.111.0>) shutdown: failed to start child: GenEvent
** (EXIT) already started: #PID<0.75.0>
Run Code Online (Sandbox Code Playgroud)
显然应用程序已经启动,因此我需要访问其工作进程.如果我有主管,我可以使用Supervisor.which_children来获取它们.要做到这一点,也许有助于运行kv应用程序:
iex(28)> kvpid = :application.info[:running][:kv]
#PID<0.77.0>
Run Code Online (Sandbox Code Playgroud)
所以现在我有了应用程序的PID.是否有某种方法可以从中获取根管理程序进程,或者我是否必须手动将其注册到某处以从测试中获取它?
或者有没有办法直接从他们的名字中获取工人?我试过:erlang.whereis但它找不到工人:
iex(33)> :erlang.whereis KV.Registry
:undefined
Run Code Online (Sandbox Code Playgroud)
我尝试直接使用模块的名称,但这也不起作用:
test "all buckets die if registry dies" do
reg = KV.Registry
KV.Registry.create(reg, "shopping")
{:ok, shopping_bucket} = KV.Registry.lookup(reg, "shopping")
Process.exit(reg, :shutdown)
assert_receive {:exit, "shopping", ^shopping_bucket}
end
Run Code Online (Sandbox Code Playgroud)
它失败并出现此错误:
1) test all buckets die if registry dies (KV.SupervisorTest)
test/kv/supervisor_test.exs:4
** (ArgumentError) argument error
stacktrace:
:erlang.send(KV.Registry, {:"$gen_cast", {:create, "shopping"}})
(elixir) lib/gen_server.ex:424: GenServer.do_send/2
test/kv/supervisor_test.exs:6
Run Code Online (Sandbox Code Playgroud)
Mir*_*mek 10
您找不到KV.Registry,因为您的代码中存在拼写错误.你打电话:
worker(KV.Registry, [@manager_name, [name: @registry_name]])
Run Code Online (Sandbox Code Playgroud)
但定义是:
def start_link(event_manager, buckets_supervisor, opts \\ []) do
Run Code Online (Sandbox Code Playgroud)
所以你将[name:KV.Registry]作为buckets_supervisor传递,opts是[],因此你的工人没有以KV.Registry的名义注册.
试试这个补丁:https://github.com/mprymek/kv/commit/03ce2e4e5ab4287db2fab6de0bb1aeaf0226346f
iex(1)> :erlang.whereis KV.Registry
#PID<0.111.0>
Run Code Online (Sandbox Code Playgroud)
如果您启动主管给它一个名字,您可以让所有工人:
Supervisor.which_children(MyApp.Supervisor)
Run Code Online (Sandbox Code Playgroud)
可能发生的是你试图开始两个worker(GenEvent, ...),他们将有重复的事件.:id明确地传递选项可能会解决它.
| 归档时间: |
|
| 查看次数: |
4272 次 |
| 最近记录: |