Добавить ребенка в Dynamic Supervisor в Elixir - PullRequest
0 голосов
/ 25 ноября 2018

Я пытаюсь создать DynamicSupervisor для контроля другого GenServer по запросу к нему и затем пытаюсь проверить его.

Вот мой код для NodeDynamicSupervisor:

defmodule NodeDynamicSupervisor do
  use DynamicSupervisor

  def start_link() do
    DynamicSupervisor.start_link(__MODULE__, :ok, name: __MODULE__)
  end

  def init(:ok) do
    DynamicSupervisor.init(strategy: :one_for_one)
  end

  def add_node(private_key, public_key, address, num_of_coins) do
    child_spec = {Node, {private_key, public_key, address, num_of_coins}}
    DynamicSupervisor.start_child(__MODULE__, child_spec)
  end
end

Вот как я его тестирую:

defmodule NodeCreationTest do
  use ExUnit.Case
  import ExUnit.CaptureIO

  test "should create node" do
    {:ok, node_pid} = NodeDynamicSupervisor.start_link()
    capture_io(node_pid.add_node(private_key, public_key, address, 0))
  end 
end

И вот эта ошибка, которую я получаю:

 code: capture_io(node_pid.add_node(private_key, public_key, address, 0))
 stacktrace:
   :erlang.apply(#PID<0.163.0>, :add_node, [])
   test/create_nodes_test.exs:12: (test)

Почему я не могу добавить узел и получить эту ошибку вместо этого?

1 Ответ

0 голосов
/ 25 ноября 2018

С вашим кодом есть две проблемы:


1.Вы не можете вызывать методы для pid:

Вы вызываете node_pid.add_node(...) в своем тесте, что неверно, когда вы должны вызывать функцию из модуля.Поскольку ваш DynamicSupervisor процесс назван (name: __MODULE__) и ваш add_node/4 уже передает pid / name процесса в реализации, вы можете просто вызвать его напрямую:

NodeDynamicSupervisor.add_node(private_key, public_key, address, 0)

2.capture_io принимает функцию в качестве аргумента:

В вашем случае вы сначала вызываете функцию и передаете ее результат методу.Вам нужно вызвать метод внутри анонимной функции и передать вместо этого capture_io/1:

capture_io(fn ->
  NodeDynamicSupervisor.add_node(private_key, public_key, address, 0)
end)
...