2016-10-17 5 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 

Runner Модуль:

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

Вы не вызываете 'input' снова после' receive', поэтому ваш процесс, вероятно, умирает после ответа на 1 сообщение. – Dogbert

+0

Спасибо, Dogbert! Я ошибался setup_all, чтобы запускать каждый раз – quantumpotato

ответ

1

Почему 1 тест работает с настройкой, но не с другим (прыгать)?

Это происходит потому, что ваш процесс реагирует только на одно сообщение, а затем умирает, и вы используете setup_all вместо setup, что означает, что процесс запускается только один раз, перед первым испытанием будет RAN, и то же самое pid является прошел все тесты.

Вы можете либо изменить setup_all на setup, если вы хотите создать новый процесс для каждого теста, или заставить ваш процесс отвечать на более чем 1 сообщение (возможно, бесконечное использование саморекурсии).