Zrobiłem trochę google i nie mogę znaleźć niczego na ten temat - albo Elixir jest zbyt młodym językiem, albo szukam niewłaściwych terminów.Najlepsza praktyka dla testujących nadzorców w Elixir
Pracuję poprzez samouczek Jose Valim'a na temat Elixir Portal (https://howistart.org/posts/elixir/1) i buduję testy do ćwiczeń (mam wbudowaną całą funkcjonalność).
Część samouczka tworzy superwizora, aby moduł PortalDoor był odporny na błędy.
Próbuję przetestować odporność na uszkodzenia (np że Inspektor restartuje instancji Portal.Door jeśli jest niewłaściwie shutdown) za pomocą następującego kodu
defmodule PortalTest do
use ExUnit.Case, async: true
...
test "supervisor restarts doors" do
{:ok, pid} = Portal.shoot(:third)
Process.unlink(pid)
Process.exit(pid, :shutdown)
assert Portal.Door.get(:third) == [] #new doors initialize with an empty array
end
end
ale wciąż otrzymuję ten błąd podczas uruchamiania test:
1) test supervisor restarts doors (PortalTest)
test/portal_test.exs:35
** (exit) exited in: GenServer.call(:third, {:get, #Function<3.47016826/1 in Portal.Door.get/1>}, 5000)
** (EXIT) shutdown
stacktrace:
(elixir) lib/gen_server.ex:356: GenServer.call/3
test/portal_test.exs:39
Tak, zastanawiam się, czy jest lepszy sposób to zrobić lub mój kod jest po prostu zły.
Właściwie odbieram moje oryginalne oświadczenie. Wydaje się, że kiedy używam IO.inspect do debugowania, powoduje to opóźnienie, które wystarcza do ponownego uruchomienia procesu. Bez tego użycie rekursji do oczekiwania na Process.whereis/1 na zwracanie czegoś innego niż wartość zerowa nie działa (prawdopodobnie moja wina). Tak, idę z: timer.sleep/1 na teraz. – user2577226