传递状态[:pid]的消息失败,新生成的pid工作正常

时间:2016-10-17 16:13:05

标签: elixir ex-unit

我的第二次考试失败了。

 1) test it jumps when it can (RunnerTest)
     test/runner_test.exs:15
     No message matching %{y: 1} after 100ms.
     The process mailbox is empty.
     stacktrace:
       test/runner_test.exs:18: (test)

defmodule RunnerTest do
  use ExUnit.Case
  doctest Runner

  setup_all do
    {:ok, pid: spawn(fn -> Runner.input() end)}
  end

  test "it increases its x position", state do
    avatar = %{x: 0, y: 0}
    send state[:pid], {:run, self, avatar}
    assert_receive %{x: 1}
  end

  test "it jumps when it can", state do
    avatar = %{x: 0, y: 0}
    send state[:pid], {:jump, self, avatar}
    assert_receive %{y: 1}
  end

end

亚军模块:

defmodule Runner do
    def input do
      receive do
       {:run, sender, mover} -> send sender, run(mover)
       {:jump, sender, mover} -> send sender, jump(mover)
     end
    end

    defp run(mover) do
        Map.merge(mover, %{x: mover.x + 1})
    end

    defp jump(mover) do
        case {mover.y} do
          {0} ->
            Map.merge(mover, %{y: mover.y + 1})
          _ ->
            mover
        end
    end

end

此测试通过:

 test "it jumps when it can", state do
    avatar = %{x: 0, y: 0}
    pid = spawn(fn -> Runner.input() end)
    send pid, {:jump, self, avatar}
    assert_receive %{y: 1}
  end

为什么1次测试(运行)使用设置而不是其他(跳转)?

1 个答案:

答案 0 :(得分:1)

  

为什么1次测试(运行)使用设置而不是其他(跳转)?

这是因为您的流程只响应一条消息然后死亡而您正在使用setup_all而不是setup,这意味着该流程仅在第一次测试之前启动一次运行,并将相同的pid传递给所有测试。

如果您想为每个测试生成一个新进程,或者让您的进程响应多条消息(使用自递归可能是无限的),您可以将setup_all更改为setup