Работая с частью учебника Getting Started, я пишу блок-тест для проблемы дерева наблюдения внизу. Я попытался начать супервизор верхнего уровня, но он не смог с этой ошибкой:Как найти работников в моем приложении Elixir?
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>
Видимо приложение уже запущенно, так что мне нужно, чтобы получить доступ к его рабочим процессам. Я мог бы использовать Supervisor.which_children, чтобы получить их, если бы у меня был супервайзер. Для того, чтобы получить, что, может быть, это помогло бы иметь запущенный kv
приложение:
iex(28)> kvpid = :application.info[:running][:kv]
#PID<0.77.0>
Так что теперь у меня есть PID для приложения. Есть ли способ получить от него процесс супервизора root, или мне нужно вручную зарегистрировать его где-нибудь, чтобы получить от него тест?
Или есть способ напрямую получить рабочих от их имен? Я попытался :erlang.whereis
, но он не находит работника:
iex(33)> :erlang.whereis KV.Registry
:undefined
Я пытался использовать имя модуля непосредственно, но это не работает, либо:
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
Это терпит неудачу с этой ошибкой:
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
Чтобы получить ответвление на этот вопрос, вы должны добавить этот шаг: '$ git checkout -b s_o_question origin/s_o_find_worker_question' – ijt