2016-10-17 10 views
-1

私の2番目のテストは失敗しています。状態[:pid]で渡すメッセージが失敗し、新しく生成されたpidが動作します

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

あなたは 'receive'の後に' input'をもう一度呼び出さないので、あなたのプロセスはおそらく1つのメッセージに応答して死ぬでしょう。 – Dogbert

+0

ありがとうございます!毎回setup_allが間違っていた – quantumpotato

答えて

1

1つのテスト(実行)はセットアップで動作しますが、もう1つ(ジャンプ)で動作しないのはなぜですか?

あなたのプロセスが1件のメッセージのみに応答して、死ぬと、あなたがプロセスを意味setup、の代わりにsetup_allを使用している最初のテストが実行される前に、一度だけ起動され、そして同じpidがあるためですすべてのテストに合格しました。

テストごとに新しいプロセスを生成する場合、またはプロセスが2つ以上のメッセージに応答するようにする場合はsetup_allsetupに変更できます(自己再帰を使用して無限になる可能性があります)。

関連する問題