首页 > 解决方案 > 在 Elixir 中将孩子添加到动态主管

问题描述

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

为什么我无法添加节点并收到此错误?

标签: elixirerlang-otperlang-supervisor

解决方案


您的代码有两个问题:


1.您不能在 a 上调​​用方法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以函数为参数:

In your case you're first calling the function and passing its result to the method. You need to call the method inside an anonymous function and pass that to capture_io/1 instead:

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

推荐阅读