我正在尝试创建一个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)
这是我得到的错误:
const { session, isPaused, intervalBegan, breakBegan } = this.state;
为什么我无法添加节点却出现此错误?
答案 0 :(得分:2)
您的代码有两个问题:
1。您无法在pid
上调用方法:
您应在测试中调用node_pid.add_node(...)
,这是不正确的,您应该从模块中调用函数。由于您的DynamicSupervisor
进程被命名为(name: __MODULE__
,并且您的add_node/4
已经在实现中传递了进程pid /名称,因此您可以直接调用它:
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)