エリクシールで基本的なコードテストを習得しようとしていて、非同期関数のテスト(genserverのhandle_infoとキャスト)の周りに頭を下げるのに問題があります。GenServer非同期統合テスト
動作するが間違っている方法の1つは、非同期機能のキャスト後に:timer.sleep(x)
を使用することです。
例えば、ステートからのアイテムのリストを処理し、外部APIからデータをフェッチする別のモジュールへの呼び出しをディスパッチし、メッセージ(apiデータ)を同じgenserverに送り返すと想像してください。
これをテストするにはどうすればよいでしょうか?テスト中のgenserverメッセージ/メールボックスを監視できますか?
編集: 別の例に、initに私がDBから初期状態を取得するには、この操作を行うと言う:
Process.send_after(self(), :started, 0)
そして:は次のようになりました:
defhandleinfo :started, state: state, do: new_state(UserServerStarted.get_data(state))
を私は他のを持っていますかオプション:UserServerStartedが正しいものを返したかどうかを確認するtimer.sleep?私はモジュール/ユニットを別々にテストすることができますが、完全な統合テストをしたいと思います。
... SETUP - Supervisor start UserServer...
test "spin up server and inital tree after user registers", %
{user: user} do
:timer.sleep(500)
assert %{"default" => [nil]} == GenServer.call(UserServer.via_tuple(user.id), :get)
end
あなたは 'Process.infoを使用してメールボックスのメッセージを取得することができます(PID 、:messages) 'というメッセージが表示されますが、以前のメッセージを処理していない限り、GenServerがメッセージを受信すると直ちにそのメッセージを処理するため、これはGenServerと確実には機能しません。 – Dogbert