Durch den Supervisor and Application Teil des Getting Started-Tutorials arbeitend, schreibe ich einen Komponententest für das Supervision Tree-Problem an der Unterseite. Ich versuchte, den Top-Level-Supervisor starten, aber es konnte nicht mit diesem Fehler:Wie finde ich die Arbeiter in meiner Elixir-Anwendung?
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>
Anscheinend ist der App bereits gestartet, so muß ich den Zugang zu seinem Arbeitsprozesse erhalten. Ich könnte Supervisor.which_children verwenden, um sie zu bekommen, wenn ich den Supervisor hätte. Um das zu bekommen, vielleicht würde es helfen, die laufenden kv
Anwendung haben:
iex(28)> kvpid = :application.info[:running][:kv]
#PID<0.77.0>
So, jetzt ich die PID für die App haben. Gibt es eine Möglichkeit, den Root-Supervisor-Prozess von diesem zu erhalten, oder muss ich ihn manuell irgendwo registrieren, um von dem Test zu kommen?
Oder gibt es eine Möglichkeit, die Arbeiter direkt von ihren Namen zu bekommen? Ich habe versucht, :erlang.whereis
aber es findet nicht den Arbeiter:
iex(33)> :erlang.whereis KV.Registry
:undefined
ich direkt den Namen des Moduls versucht, mit, aber das funktioniert auch nicht:
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
Es schlägt mit diesem Fehler:
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
Um die Verzweigung für diese Frage zu erhalten, müssen Sie diesen Schritt hinzufügen: '$ git checkout -b s_o_question Herkunft/s_o_find_worker_question ' – ijt