Testの書き方 プロセス編
Supervisorの監視ツリーに追加しているプロセスを
確認するテストを記述する方法をまとめる。
application.ex内のSupervisorの監視ツリーに追加したプロセス、またはSupervisorは、
テスト時にも起動されるらしい。
追加していない場合は以下を参照すること
起動を確認するテストの書き方
プロセスが起動していることを確認するには、次の記述を使用すると良い。
assert is_pid(GenServer.whereis(プロセスモジュール))
GenServer.whereis(プロセスモジュール)でプロセスのidを取得し、
is_pidでプロセスのIDであるかチェックしている。
再起動を確認するテストの書き方
以下の記述を行うことでプロセスの監視を開始し、
プロセスの終了時にメッセージを送信することができる。
ref = Process.monitor(プロセスID)
プロセスが終了したときに送信されるメッセージは、次の形式で送信される。
{:DOWN, #Reference<...>, :process, #PID<...>, 終了理由}
終了理由には以下のいずれかになる。
- 
:nomal-GenServer.stop()などで終了させた場合に設定される。
- 
:killed-Process.exit(プロセスID, :kill)を実行した際に設定される。
プロセスを意図的に終了させるには、以下の関数を使用する。
Process.exit(プロセスID, :kill)
具体的なコードは次のようになる。
p_id = GenServer.whereis(プロセスモジュール)
p_ref = Process.monitor(p_id)
Process.exit(p_id, :kill)
receive do
  {:DOWN, ^p_ref, :process, ^p_id, :killed} ->
    # プロセスの再起動を待つ
    Process.sleep(1000)
    assert is_pid(GenServer.whereis(p_id))
after
  1000 ->
    # flunk()で失敗メッセージを記述する
    flunk("not restarted.")
end
Process.monitorとは
Process.monitor()の戻り値は以下のようになる。
#Reference<...>
ここではパターンマッチに使用し、
どのモニター参照からのメッセージかを指定するために必要になる。
