我正在尝试从我的模块中测试一个函数。每当我尝试生成它时,我都会收到一个错误,其中函数的结果被传递给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
当我运行时,我的测试永远不会结束,因为据我所知,移动进入无限循环。
答案 0 :(得分:1)
spawn/1
函数的参数错误。试试这个:
spawn(&Runner.move/0)
答案 1 :(得分:0)
你有spawn/1
,它采用匿名函数或spawn/3
,它将模块,函数名称作为原子和列表中的参数列表。
使用:
spawn(fn -> Runner.move() end)
或
spawn(Runner, :move, [])