ArgumentError产生函数 - 如何在不运行的情况下生成对函数的引用?

时间:2016-10-17 03:44:54

标签: elixir

我正在尝试从我的模块中测试一个函数。每当我尝试生成它时,我都会收到一个错误,其中函数的结果被传递给spawn函数。

defmodule Runner do
    def move do
      "hi"
    end
end

defmodule RunnerTest do
  use ExUnit.Case
  doctest Runner

  test "the truth" do
    assert 1 + 1 == 2
  end

  test "it increases its x position" do
    pid = spawn(Runner.move)
  end

end

  1) test it increases its x position (RunnerTest)
     test/runner_test.exs:9
     ** (ArgumentError) argument error
     stacktrace:
       :erlang.spawn("hi")
       test/runner_test.exs:10: (test)

我期待生成Runner.move进程,然后我可以稍后执行以获得结果。相反,“hi”直接传递给spawn。

我通过简化以下代码发现了这一点:

defmodule Runner do
    def move do
      receive do
       {:move, x, sender} -> send sender, x + 1
     end
    end
end

当我运行时,我的测试永远不会结束,因为据我所知,移动进入无限循环。

2 个答案:

答案 0 :(得分:1)

spawn/1函数的参数错误。试试这个:

spawn(&Runner.move/0)

答案 1 :(得分:0)

你有spawn/1,它采用匿名函数或spawn/3,它将模块,函数名称作为原子和列表中的参数列表。

使用:

spawn(fn -> Runner.move() end)

spawn(Runner, :move, [])
相关问题