在Elixir中将孩子添加到动态主管

时间:2018-11-25 04:22:12

标签: elixir otp supervisor

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

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

1 个答案:

答案 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)