elixir - 在 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)
为什么我无法添加节点并收到此错误?
解决方案
您的代码有两个问题:
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)