【问题标题】:Add a child to a Dynamic Supervisor in Elixir在 Elixir 中将孩子添加到动态主管
【发布时间】:2019-04-27 03:00:11
【问题描述】:

我正在尝试创建一个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)

为什么我无法添加节点并出现此错误?

【问题讨论】:

    标签: elixir erlang-otp erlang-supervisor


    【解决方案1】:

    您的代码有两个问题:


    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)
    

    【讨论】:

    • 谢谢 :) 附带说明一下,不要将您的节点模块命名为 Node,因为您将覆盖 Elixir 的内置模块。
    猜你喜欢
    • 2017-09-20
    • 2016-04-10
    • 2011-11-26
    • 2015-01-07
    • 2021-03-16
    • 2016-06-24
    • 1970-01-01
    • 2017-02-21
    • 1970-01-01
    相关资源
    最近更新 更多