Podczas pracy nad samouczkiem Wprowadzenie, piszę test jednostkowy dla problemu drzewa nadzoru na dole. Próbowałem rozpoczęciem przełożonego najwyższego poziomu, ale nie powiodło się z tego błędu:Jak znaleźć pracowników w mojej aplikacji 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>
Widocznie aplikacja jest już uruchomiona, więc muszę mieć dostęp do swoich procesów roboczych. Gdybym miał przełożonego, mógłbym skorzystać z pomocy Opiekuna. Aby dostać się, że może to pomóc, aby mieć uruchomiony kv
aplikację:
iex(28)> kvpid = :application.info[:running][:kv]
#PID<0.77.0>
Więc teraz mam PID dla aplikacji. Czy jest jakiś sposób, aby uzyskać od tego proces administratora root, czy muszę ręcznie zarejestrować go gdzieś, aby uzyskać z niego test?
Czy istnieje sposób na bezpośrednie pozyskanie pracowników od ich nazwisk? Próbowałem :erlang.whereis
ale nie znajdzie pracownikowi:
iex(33)> :erlang.whereis KV.Registry
:undefined
Próbowałem za pomocą nazwy modułu bezpośrednio, ale to nie działa albo:
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
nie powiedzie się z tego błędu:
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
Aby uzyskać oddział dla tego pytania, musisz dodać ten krok: '$ git checkout -b s_o_question origin/s_o_find_worker_question' – ijt