Я искал битку и немного не мог найти что-либо по этому вопросу - либо эликсир слишком молод, либо я искал неправильные термины.Лучшая практика для тестирования супервизоров в Elixir
Я работаю над учебником по проекту Elixir Portal от Jose Valim (https://howistart.org/posts/elixir/1) и собираю тесты для практики (я создал всю функциональность).
Часть учебного пособия предназначена для создания супервизора, чтобы сделать Portal.Door модулем отказоустойчивым.
Я пытаюсь проверить отказоустойчивость (например, что руководитель перезапускает экземпляр Portal.Door, если он неправильно выключение), используя следующий код
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
Но я получаю эту ошибку, когда я бегу тест:
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
Итак, мне интересно, есть ли лучший способ сделать это, или мой код просто плохой.
На самом деле я возвращаю свое первоначальное заявление. Похоже, что когда я использую IO.inspect для выполнения некоторой отладки, это вызывает задержку, которая достаточно долго для перезапуска процесса. Без него использование recursion для ожидания Process.whereis/1 для возврата чего-то другого, кроме значения nil, похоже, не работает (вероятно, моя ошибка). Итак, я собираюсь: timer.sleep/1 на данный момент. – user2577226