2016-10-17 3 views
-1

두 번째 테스트가 실패했습니다.[: 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

감사합니다. Dogbert! 매번 setup_all을 실행하는 데 착각했습니다. – quantumpotato

답변

1

왜 1 테스트 (실행)가 설정과 함께 작동 하나 다른 테스트 (뛰기)가 작동하지 않습니까?

프로세스가 하나의 메시지에 응답 한 후 사망하고 과정을 의미 setup, 대신 setup_all를 사용하는 첫 번째 테스트가 실행 된되기 전에 한 번만 시작, 같은 pid이기 때문이다 모든 검사를 통과했다.

각 테스트에 대해 새 프로세스를 생성하거나 프로세스가 둘 이상의 메시지에 응답하도록하려면 setup_allsetup으로 변경하거나 (자체 재귀를 사용하여 무한대로) 가능할 수 있습니다.